AFNetworking 2.0 中的 AFHTTPRequestOperationManager 如何传递 HTTPBody 标签
Posted
技术标签:
【中文标题】AFNetworking 2.0 中的 AFHTTPRequestOperationManager 如何传递 HTTPBody 标签【英文标题】:AFNetworking 2.0 in AFHTTPRequestOperationManager how to pass HTTPBody tag 【发布时间】:2014-12-24 10:53:26 【问题描述】:我正在使用 AFNetworking 2.0,在此我必须在正文部分传递 json 对象,如何在 AFHTTPRequestOperationManager 中传递 HTTP 正文。
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @@"foo": @"bar";
NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"];
[manager POST:@"http://example.com/resources.json" parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData)
[formData appendPartWithFileURL:filePath name:@"image" error:nil];
success:^(AFHTTPRequestOperation *operation, id responseObject)
NSLog(@"Success: %@", responseObject);
failure:^(AFHTTPRequestOperation *operation, NSError *error)
NSLog(@"Error: %@", error);
];
谢谢,
【问题讨论】:
我建议appendWithFormData:name:
。从理论上讲,如果您也觉得有必要指定 Content-Type
,您可以使用 appendPartWithHeaders:body:
,手动指定 Content-Disposition
和 Content-Type
标头,但这似乎更麻烦并且可能没有必要。
我需要在上面的方法中添加这个方法吗?
在constructingBodyWithBlock
块内。在您的 appendPartWithFileURL
之前或之后。
我试过这样[formData appendWithFormData - 但是没有appendWithFormData方法,我需要通过HTTPBody
我想要这个 NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; [请求 setHTTPBody:postBody];
【参考方案1】:
与您离线聊天,听起来主要关心的是如何在单个请求中发送个人资料图像、姓名、电子邮件地址、用户名和密码。它可能看起来像:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSURL *filePath = ...
[manager POST:@"http://example.com/registration.json" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData)
[formData appendPartWithFileURL:filePath name:@"image" error:nil];
[formData appendPartWithFormData:[name dataUsingEncoding:NSUTF8StringEncoding] name:@"name"];
[formData appendPartWithFormData:[email dataUsingEncoding:NSUTF8StringEncoding] name:@"email"];
[formData appendPartWithFormData:[userid dataUsingEncoding:NSUTF8StringEncoding] name:@"userid"];
[formData appendPartWithFormData:[password dataUsingEncoding:NSUTF8StringEncoding] name:@"password"];
success:^(AFHTTPRequestOperation *operation, id responseObject)
NSLog(@"Success: %@", responseObject);
failure:^(AFHTTPRequestOperation *operation, NSError *error)
NSLog(@"Error: %@", error);
];
不需要 JSON。
如果你想使用 JSON,你可以这样做,但你不会使用 constructingBodyWithBlock
方法(它会创建一个 multipart/form-data
请求)。相反,您只需创建一个普通的旧 JSON 请求,例如:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
NSDictionary *parameters = @
@"name" : name,
@"email" : email,
@"userid" : userid,
@"password" : password,
@"image" : base64EncodedImage
;
[manager POST:@"http://example.com/registration.json" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject)
NSLog(@"Success: %@", responseObject);
failure:^(AFHTTPRequestOperation *operation, NSError *error)
NSLog(@"Error: %@", error);
];
显然,这些是非常不同的方法,因此无论您采用哪种方法,都需要编写服务器代码来处理相同的 API。
【讨论】:
以上是关于AFNetworking 2.0 中的 AFHTTPRequestOperationManager 如何传递 HTTPBody 标签的主要内容,如果未能解决你的问题,请参考以下文章
域=NSCocoaErrorDomain 代码=3840 afnetworking 2.0 中的错误
Swift 中 AFNetworking 2.0 中的 Web 服务调用问题
AFNetworking 2.0 iOS 7 复制与 AFHTTPRequestOperation.h 文件中的区域警告
AFNetworking 2.0 从故障块中的代码 400 获取 JSON