2013-10-15 35 views
0

我使用RestKit 0.20和iOS 7.如何正確地將錯誤響應與代碼200進行映射?

我想映射來自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返回錯誤。

這不是創建此響應RKObjectMappingRKResponseDescriptor和檢查響應類success塊的問題,而是如何通知RESTKit說,從「錯誤」開始響應關鍵路徑應視爲錯誤,即使狀態碼是200並致電failure塊?

+1

爲什麼要將其類作爲失敗?除非你想將錯誤響應映射到一個'NSError'實例。只需處理成功塊中的結果即可。 – Wain

回答

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; 
}