使用AFNetworking / AFHTTPRequestOperation处理意外的响应内容类型

时间:2014-04-23 20:47:43

标签: ios objective-c afnetworking afnetworking-2

我正在使用AFNetworking在我的iOS应用中处理HTTP请求。我遇到了绊脚石。我无法确定响应内容类型是什么,但您必须在处理请求之前设置响应序列化程序。这意味着我可以执行API请求,期望返回图像,但实际上存在一些身份验证错误,因此服务器会返回JSON格式的响应。

这是我的代码:

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图像等)?

2 个答案:

答案 0 :(得分:3)

使用acceptableContentTypes

在序列化程序中设置所需的已接受内容​​类型
AFJSONResponseSerializer *serializer = [AFJSONResponseSerializer serializer];
serializer.acceptableContentTypes = [NSSet setWithArray:@[@"text/plain", @"text/html"]];
[op setResponseSerializer:serializer];

来自docs

  

默认情况下,AFJSONSerializer接受以下MIME类型   包括官方标准,application / json,以及其他   常用类型:

application/json
text/json

您不必使用AFJSONResponseSerializer,因为您可以创建自己的序列化程序,只要它符合AFURLResponseSerialization协议。

如果您有JSON个回复但XML个错误回复,则可以将AFHTTPResponseSerializer作为子类并在那里进行自己的处理。

您还可以使用AFCompoundResponseSerializer来解析不同的响应类型,只需通过您提供的序列化程序。

答案 1 :(得分:1)

你的API有点不寻常:如果你没有被授权,它应该只使用HTTP 401响应,而不是JSON。但是那里有很多不寻常的API,我打赌你无法控制这个。

修复很简单:

实现仅作为代理的AFURLResponseSerialization实现,并将其指定为您的请求的序列化程序。当响应进来时,让它快速查看数据,然后实例化并调用正确的序列化器。