2014-04-23 61 views
0

我正在使用AFNetworking在iOS應用程序中處理HTTP請求。我遇到了一個絆腳石。我無法確定響應內容的類型,但必須在處理請求之前設置響應串行器。這意味着我可以做一個API請求,期待一個圖像回來,但實際上有一些驗證錯誤,所以服務器返回一個JSON格式的響應。使用AFNetworking/AFHTTPRequestOperation處理意外響應內容類型

這裏是我的代碼:

AFHTTPRequestOperation* op = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 
[op setResponseSerializer:[AFJSONResponseSerializer serializer]]; // ?????? 
[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) 
{ 
    NSDictionary* result = (NSDictionary*) responseObject; 
    onSuccess((NSArray*) result); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    onFailure(error); 
}]; 
[op start]; 

正如你所看到的,我不得不由responseSerializer設置爲[AFJSONResponseSerializer串行]隱式設置預期的內容類型。所以,如果我還有其他東西回來,它會導致錯誤,儘管我可能仍然希望解析處理錯誤時的響應流程。所以我的問題是,我應該只使用標準的AFHTTPResponseSerializer,檢查響應狀態代碼,然後手動處理響應正文(如json,xml,html和圖像等)?

回答

3

設置希望接受的內容類型的串行器與acceptableContentTypes

AFJSONResponseSerializer *serializer = [AFJSONResponseSerializer serializer]; 
serializer.acceptableContentTypes = [NSSet setWithArray:@[@"text/plain", @"text/html"]]; 
[op setResponseSerializer:serializer]; 

docs

By default, AFJSONSerializer accepts the following MIME types, which includes the official standard, application/json, as well as other commonly-used types:

application/json 
text/json 

您不必使用AFJSONResponseSerializer,你可以創建自己的串行器,只要它符合AFURLResponseSerialization協議即可。

如果您有JSON響應,但是XML錯誤響應,您可以子類AFHTTPResponseSerializer並在那裏做自己的處理。

您也可以使用AFCompoundResponseSerializer解析不同的響應類型,只需通過您提供的序列化程序即可。

+0

如果我更改可接受內容類型的列表,AFJSONResponseSerializer是否嘗試將XML解碼爲JSON?看看實現,似乎validateResponse方法會成功,但[NSJSONSerialization JSONObjectWithData]將返回nil。 – krisdyson

+0

@Boomerangertanger這是正確的,但你仍然可以繼承'AFJSONResponseSerializer'並覆蓋['responseObjectForResponse:data:error:'](http://cocoadocs.org/docsets/AFNetworking/2.2.3/Protocols/AFURLResponseSerialization.html# // api/name/responseObjectForResponse:data:error :)返回你的回覆或錯誤 – Rich

+0

@Boomerangertanger還有['AFCompoundResponseSerializer'](http://cocoadocs.org/docsets/AFNetworking/2.2.3/Classes/AFCompoundResponseSerializer。 HTML)這可能更接近你的需求? – Rich

1

你的API有點不尋常:如果你沒有授權,它應該只使用HTTP 401響應,而不是JSON。但是有很多不同尋常的API,我敢打賭你無法控制這個。

修復的方法是直截了當:

使AFURLResponseSerialization的實現,只是充當代理,並指定一個作爲串行對您的請求。當響應進入時,讓它快速查看數據,然後實例化並調用正確的串行器。

+0

是的,認證錯誤就是一個例子。我可能會從API請求一個圖像,但實際上會收到描述錯誤的JSON格式的響應,並附帶參考號,原因碼和500狀態碼。感謝您的幫助,我認爲這可能是這種情況。 – krisdyson

相關問題