我正在使用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和圖像等)?
如果我更改可接受內容類型的列表,AFJSONResponseSerializer是否嘗試將XML解碼爲JSON?看看實現,似乎validateResponse方法會成功,但[NSJSONSerialization JSONObjectWithData]將返回nil。 – krisdyson
@Boomerangertanger這是正確的,但你仍然可以繼承'AFJSONResponseSerializer'並覆蓋['responseObjectForResponse:data:error:'](http://cocoadocs.org/docsets/AFNetworking/2.2.3/Protocols/AFURLResponseSerialization.html# // api/name/responseObjectForResponse:data:error :)返回你的回覆或錯誤 – Rich
@Boomerangertanger還有['AFCompoundResponseSerializer'](http://cocoadocs.org/docsets/AFNetworking/2.2.3/Classes/AFCompoundResponseSerializer。 HTML)這可能更接近你的需求? – Rich