【问题标题】:AFHTTPSessionManager add body to POSTAFHTTPSessionManager 将正文添加到 POST
【发布时间】:2014-12-05 13:47:12
【问题描述】:

我也需要向我的服务器发出发布请求。

使用 AFHTTPRequestOperation 非常简单,只需使用:

[request setHTTPBody: [requestBody dataUsingEncoding:NSUTF8StringEncoding]];

但是我找不到任何示例如何使用 AFHTTPSessionManager 使用相同的方法。

使用方法:

[self POST:@"extraLink" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {

} success:^(NSURLSessionDataTask *task, id responseObject) {

} failure:^(NSURLSessionDataTask *task, NSError *error) {

}];

如何将正文添加到“AFMultipartFormData”?

提前感谢

【问题讨论】:

标签: ios ios7 afnetworking-2


【解决方案1】:

取自 AFNetworking home page,要创建 multipart/form-data 请求,请调用 appendPartWithFileURL

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);
}];

AFHTTPRequestOperationManager 已被弃用。因此,改为使用AFHTTPSessionManagerPOST 的语法与constructingBodyWithBlock 非常相似:

AFHTTPSessionManager *manager = [AFHTTPSessionManager 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];
} progress:nil success:^(NSURLSessionDataTask *operation, id responseObject) {
    NSLog(@"Success: %@", responseObject);
} failure:^(NSURLSessionDataTask *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

或者,如果您想发布foo=bar&amp;key=value&amp;... 形式的请求(即application/x-www-form-urlencoded 请求),您可以执行以下操作:

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
NSDictionary *parameters = @{@"foo": @"bar", @"key": @"value"};
[manager POST:@"http://example.com/resources.json" parameters:parameters progress:nil success:^(NSURLSessionDataTask *task, id responseObject) {
    NSLog(@"Success: %@", responseObject);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
    NSLog(@"Error: %@", error);
}];

【讨论】:

  • 还有其他选项可以将数据附加到正文中吗?我有一个带有列表“key=value&key=value&...”的字符串,这是我的正文请求。您知道添加纯字符串的任何方法吗? @Rob
  • key=value&amp;key=value&amp;... 格式是一个 application/x-www-form-urlencoded 内容类型请求(而上面创建了一个 multipart/form-data 请求)。如果您需要application/x-www-form-urlencoded 格式,请使用不带constructingBodyWithBlock 参数的POST 的另一种格式。
  • 对不起@Rob,但我没有完全理解你。你能给我一个如何使用其他 POST 方法添加正文的示例吗?谢谢
  • 只是为了确认@Rob,我还需要将我的对象“NSString”转换为 NSDictionary 结构吗?谢谢
  • 是的,您可能想要这样做(因为 AFNetworking 会为application/x-www-form-urlencoded 请求执行必要的百分比转义)。我想您可以自己创建请求的百分比转义正文,然后自己构建请求,但这需要更多的工作。
【解决方案2】:

试试这个方法。

我正在将我的图像转换为 imageData 的数据格式。

NSData *imageData=nil;
imageData = UIImageJPEGRepresentation([UIImage imageNamed:@"yourimageName"],0.2);
NSMutableDictionary *dict=[NSMutableDictionary new];
[dict setObject:@"user1" forKey:@"param_name1"];
[dict setObject:@"User2" forKey:@"param_name2"];

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] init];

[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
manager.responseSerializer = [AFJSONResponseSerializer
                              serializerWithReadingOptions:NSJSONReadingAllowFragments];
[manager POST:@"API NAME" parameters:dict constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {

 if(imageData)
 {
     [formData appendPartWithFileData:imageData  name:@"param_name" fileName:@"filename.jpg" mimeType:@"image/jpeg"];
 }
 } progress:^(NSProgress * _Nonnull uploadProgress)
 {
     NSLog(@"%@",uploadProgress);
 } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
     NSLog(@"%@",responseObject);

 } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
     NSLog(@"%@",error);

 }];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 2021-07-02
    • 2023-03-26
    • 2017-08-29
    • 1970-01-01
    相关资源
    最近更新 更多