我使用RestKit 0.20和iOS 7。
我想映射来自REST API的错误响应。它是这样的:
{
"error": {
"error_code": 5,
"error_msg": "User authorization failed: invalid access_token.",
"request_params": [
{
"key": "oauth",
"value": "1"
},
{
"key": "method",
"value": "execute.MusicNews"
},
{
"key": "access_token",
"value": "e2276858338752ef3f6f974b0996e4a1755a5b17178781a6602be1e6c2aa0e23bfb89ec040c787d2dc753"
}
]
}
}
问题是API使用代码200
返回错误。
为此响应创建RKObjectMapping
和RKResponseDescriptor
并检查success
块中的响应类不是问题,但是如何通知RESTKit从“错误”键路径开始的响应即使状态代码为200
并且调用failure
阻止,也应视为错误?
答案 0 :(得分:2)
我的解决方案是一个小黑客:
我创建了一个子类,如:
@interface NutHTTPRequestOperation : RKHTTPRequestOperation
@end
@implementation NutHTTPRequestOperation
- (NSError *)error
{
NSError * error = nil;
//It seems only call to responseJSON could make AFJSONRequestOperation process error
id object = [self.responseString objectFromJSONString];
if ([object isKindOfClass:[NSDictionary class]]) {
NSNumber * ret = [object objectForKey:@"ret"];
if (!ret || 0 != ret.integerValue) {
NSString * desc = [object objectForKey:@"error"];
error = [NSError errorWithDomain:kNutResponseErrorDomain code:ret.integerValue userInfo:@{NSLocalizedDescriptionKey: desc}];
}
}
if(!error){
//Get super error , if none, proceed self error
NSError * error = [super error];
if (error) {
return error;
}
error = [NSError errorWithDomain:kNutResponseErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey: @"not json dictionary"}];
}
return error;
}