我正在使用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图像等)?
答案 0 :(得分:3)
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实现,并将其指定为您的请求的序列化程序。当响应进来时,让它快速查看数据,然后实例化并调用正确的序列化器。