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-DispositionContent-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

PHP REST 服务中的 JSON 格式问题从 AFNetworking 2.0 接收 POST

AFNetworking 2.0 和单元测试