2014-02-21 13 views
1

網絡2.1 - 我正在嘗試爲多部分請求創建上載任務。我正在使用Mattt在文檔中給出的示例代碼。使用網絡實現「爲多部分請求上傳任務」出錯2.1.0

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)"} 

謝謝。任何幫助是可觀的。

+0

這是你正在運行的代碼,或者你只是在這裏粘貼來自文檔的代碼? – tkanzakic

回答

1

兩件事情正在發生:

  1. 您的服務器拒絕與HTTP status code 406您的HTTP請求。
  2. 響應的主體不是有效的JSON。

在繼續之前,您可能希望在項目中安裝AFNetworkActivityLogger,以便在調試時更輕鬆地檢查網絡請求。

就#1而言,其原因取決於服務器的語義。 responseObject可能有線索。如果NSURLResponse *response的類型爲NSHTTPURLResponse,則還可以檢查標題(allHeaderFields)以獲取線索。你也可以查閱API文檔或編寫服務器的人,找出爲什麼可以返回406。

對於#2 - AFURLSessionManager默認使用AFJSONResponseSerializer來解析服務器的響應。如果服務器的響應不在JSON中,則可能需要使用不同的序列化程序。如果它可能有多種格式,您需要創建一個處理JSON的AFCompoundResponseSerializer,以及您的服務器可能返回的任何其他格式。

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

+0

你能解釋爲什麼,我也只是在文檔中跟着樣本。 - 「最後,如果你使用HTTP,你可能想使用AFHTTPSessionManager而不是AFURLSessionManager。」 – Bek

+0

@Bek這不是什麼大問題,但它提供了一些可以簡化代碼的便利方法。最大的幫助是請求序列化程序,它在URL會話管理器上不可用。 –

+0

好的,謝謝,我會查看一些文檔,我喜歡便利的方法,尤其是請求序列化器,因爲這是我在實施AFNetworking時經常遇到的問題。 – Bek

相關問題