使用 afnetworking 2.1.0 实现“多部分请求的上传任务”时出错

Posted

技术标签:

【中文标题】使用 afnetworking 2.1.0 实现“多部分请求的上传任务”时出错【英文标题】:Error Implementing " Upload Task for a Multi-Part Request" using afnetworking 2.1.0 【发布时间】:2014-02-21 09:49:29 【问题描述】:

Afnetworking 2.1 - 我正在尝试为多部分请求创建上传任务。我使用的是 Mattt 在文档中给出的示例代码。

NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"http://example.com/upload" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) 
    [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"file://path/to/image.jpg"] name:@"file" fileName:@"filename.jpg" mimeType:@"image/jpeg" error:nil];
 error:nil];

AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
NSProgress *progress = nil;

NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithStreamedRequest:request progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) 
    if (error) 
        NSLog(@"Error: %@", error);
     else 
        NSLog(@"%@ %@", response, responseObject);
    
];

[uploadTask resume];

我不断收到此错误,但我不知道为什么。

Error: Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (JSON text did not start with array or object and option to allow fragments not set.) UserInfo=0x8ac1a00 NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set., NSUnderlyingError=0x8ac1100 "Request failed: unacceptable (406)"

谢谢。任何帮助都是可观的。

【问题讨论】:

这是您正在运行的代码还是您只是将文档中的代码粘贴到此处? 【参考方案1】:

正在发生两件事:

    您的服务器正在使用HTTP status code 406 拒绝您的 HTTP 请求。 响应正文不是有效的 JSON。

在继续之前,您可能希望在项目中安装AFNetworkActivityLogger,以便在调试时更轻松地检查网络请求。

就 #1 而言,其原因取决于服务器的语义。 responseObject 中可能有线索。如果NSURLResponse *response 属于NSHTTPURLResponse 类型,您还可以检查标题(allHeaderFields)以获取线索。您还可以查阅 API 文档或编写服务器的任何人,以找出可能返回 406 的原因。

对于#2 - AFURLSessionManager 默认使用AFJSONResponseSerializer 来解析服务器的响应。如果服务器的响应不是 JSON,您可能需要使用不同的序列化程序。如果它可能有多种格式,您需要创建一个 AFCompoundResponseSerializer 来处理 JSON 以及您的服务器可能返回的任何其他格式。

最后,如果您使用的是 HTTP,您可能希望使用 AFHTTPSessionManager 而不是 AFURLSessionManager

【讨论】:

你能解释一下为什么吗,我也只是按照文档中的示例进行操作。 -- “最后,如果你使用 HTTP,你可能想要使用 AFHTTPSessionManager 而不是 AFURLSessionManager。” @Bek 这没什么大不了的,但它提供了一些可以简化代码的便捷方法。最大的帮助是请求序列化程序,它在 URL 会话管理器上不可用。 好的,谢谢,我会多看看文档,我喜欢方便的方法,尤其是请求序列化器,因为这是我在实现 AFNetworking 时经常遇到的问题。

以上是关于使用 afnetworking 2.1.0 实现“多部分请求的上传任务”时出错的主要内容,如果未能解决你的问题,请参考以下文章

AFNetworking 3.0 使用详解 和 源码解析实现原理

iOS开发之AFNetworking 3.0.4使用

iOS开发 - 用AFNetworking实现https单向验证,双向验证

AFNetworking 2.0 实现代码不起作用

JSON + AFNetworking [关闭]

iOS - 将 AFNetworking 与自定义 NSURLProtocol 类一起使用