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

时间:2014-02-21 09:49:30

标签: ios json afnetworking

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 个答案:

答案 0 :(得分:1)

发生了两件事:

  1. 您的服务器正在使用HTTP status code 406拒绝您的HTTP请求。
  2. 响应正文无效JSON。
  3. 在继续之前,您可能希望在项目中安装AFNetworkActivityLogger,以便在调试时更轻松地检查网络请求。

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

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

    最后,如果您使用的是HTTP,则可能需要使用AFHTTPSessionManager而不是AFURLSessionManager