AFNetworking 发布表单数据
Posted
技术标签:
【中文标题】AFNetworking 发布表单数据【英文标题】:AFNetworking Post Form-Data 【发布时间】:2013-01-24 15:21:41 【问题描述】:我正在尝试使用 Form-Data 向 api 发出简单的 POST 请求,但我总是得到状态 401 作为回报。
我可以轻松地在 xcode 之外(例如在 Postman 中)成功地进行调用,我所做的只是使用 Form-Data 类型的键值对 POST 到 url,但在 xcode 中它总是失败。
这是我的 AFHTTPClient:
@implementation UnpaktAPIClient
+ (id)sharedInstance
static UnpaktAPIClient *__sharedInstance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^
__sharedInstance = [[UnpaktAPIClient alloc] initWithBaseURL:[NSURL URLWithString:UnpaktAPIBaseURLString]];
);
return __sharedInstance;
- (id)initWithBaseURL:(NSURL *)url
self = [super initWithBaseURL:url];
if (self)
[self registerHTTPOperationClass:[AFJSONRequestOperation class]];
[self setParameterEncoding:AFFormURLParameterEncoding];
return self;
- (NSDictionary *)login:(NSDictionary *)credentials
[[UnpaktAPIClient sharedInstance] postPath:@"/api/v1/users/login"
parameters:credentials
success:^(AFHTTPRequestOperation *operation, id response)
NSLog(@"success");
failure:^(AFHTTPRequestOperation *operation, NSError *error)
NSLog(@"%@", error);
];
return nil;
我还尝试使用 requestOperation 创建请求:
- (NSDictionary *)login:(NSDictionary *)credentials
NSMutableURLRequest *request = [[UnpaktAPIClient sharedInstance] requestWithMethod:@"POST" path:@"/api/v1/users/login" parameters:credentials];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
success:^(NSURLRequest *request, NSHTTPURLResponse *response, id json)
NSLog(@"success");
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id json)
NSLog(@"%@", error);
];
[operation start];
return nil;
但我总是得到完全相同的错误:Error Domain=AFNetworkingErrorDomain Code=-1011 "Expected status code in (200-299), got 401"
。我期待 JSON 反馈,您可以在附图中看到成功条件。我怀疑这是非常简单的事情,但我正在努力寻找它,我对网络很陌生。任何帮助都会很棒,谢谢。
更新
由于 Postman 请求具有空白参数和标题,我想我需要进入表单正文。将请求更改为:
- (NSDictionary *)login:(NSDictionary *)credentials
NSURLRequest *request = [self multipartFormRequestWithMethod:@"POST"
path:@"/api/v1/users/login"
parameters:nil
constructingBodyWithBlock:^(id<AFMultipartFormData> formData)
];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
success:^(NSURLRequest *request, NSHTTPURLResponse *response, id json)
NSLog(@"success");
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id json)
NSLog(@"%@", error);
];
[operation start];
return nil;
现在给我一个 404 错误,这是我在没有有效电子邮件和密码的情况下所期望的,我只需要弄清楚如何将一个添加到表单的正文中,我尝试添加的任何内容都会给我“请求体流耗尽”错误。
【问题讨论】:
您是否在您的网址中添加了协议,例如 http:// ? 是的,报告的错误 URL 是我应该进行身份验证的正确 URL。 基本http认证可能有问题。对于基本身份验证,这对我有用: NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@""]]; //tmpBase 64 是 base64 格式的凭据 username:password NSString *authValue = [NSString stringWithFormat:@"Basic %@",tmpBase64]; [请求 setValue:authValue forHTTPHeaderField:@"Authorization"]; @IvanAlek 谢谢,您帮助指出了正确的方向。看看我的更新,我想如果我能正确加载键/值对,我会很高兴的。 可以在此处找到为密码创建 base64 字符串的功能:calebmadrigal.com/string-to-base64-string-in-objective-c 此解决方案适用于multipartFormRequestWithMethod
的 AFNetworking
【参考方案1】:
知道了,将键/值对添加到表单数据有点冗长,但我是这样完成的:
NSMutableData *email = [[NSMutableData alloc] init];
NSMutableData *password = [[NSMutableData alloc] init];
[email appendData:[[NSString stringWithFormat:@"paul+100@test.com"] dataUsingEncoding:NSUTF8StringEncoding]];
[password appendData:[[NSString stringWithFormat:@"qwerty"] dataUsingEncoding:NSUTF8StringEncoding]];
[formData appendPartWithFormData:email name:@"email"];
[formData appendPartWithFormData:password name:@"password"];
【讨论】:
以上是关于AFNetworking 发布表单数据的主要内容,如果未能解决你的问题,请参考以下文章
AFNetworking 2.0 多部分/表单数据上传到 mySQL
我的返回数据表单 AFNetworking JSON 未正确显示
获取 System.InvalidOperationException:请求格式无效:通过 AFNetworking 上传图像(数据)时出现多部分/表单数据错误