Restkit json来自服务器的错误响应信息

我已经用了很多时间来解决这个问题。 我使用Restkit 0.9.3与对象映射2.0。 所有的数据都是JSON。 我可以正确地进行GET,POST,PUT和DELETE操作,它是我不会捕获和映射的响应体。

所以我的问题是,我的宁静API是返回错误时出现问题。 我想用restkit映射这些错误,fx返回这个错误:

{“code”:“401”,“message”:“未经授权”}

我如何映射这个JSON正确? 我已经尝试了很多东西,可以使用一些指导 – 或者请举一个例子。

对于版本0.10.0,此响应错误可以如下映射:

RKObjectMapping *errorMapping = [RKObjectMapping mappingForClass:[RKErrorMessage class]]; [errorMapping mapKeyPath:@"message" toAttribute:@"errorMessage"]; [[[RKObjectManager sharedManager] mappingProvider] setErrorMapping:errorMapping]; 

返回错误的请求将调用以下委托方法:

 - (void)objectLoader:(RKObjectLoader *)objectLoader didFailWithError:(NSError *)error { NSArray *errorMessages = [[error userInfo] objectForKey:RKObjectMapperErrorObjectsKey]; RKErrorMessage *errorMessage = [errorMessages objectAtIndex:0]; // First and only object in your case. NSString *message = [errorMessage errorMessage]; NSInteger code = [[objectLoader response] statusCode]; NSLog(@"ERROR: [%d] %@", code, message); // => ERROR: [401] Unauthorized } 

对于RestKit v0.20

假设你的HTTP正文是:

 {"error": "..."} 

你创build一个映射和描述符:

 RKObjectMapping *errorMapping = [RKObjectMapping mappingForClass:[RKErrorMessage class]]; [errorMapping addPropertyMapping: [RKAttributeMapping attributeMappingFromKeyPath:@"error" toKeyPath:@"errorMessage"]]; RKResponseDescriptor *errorResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:errorMapping pathPattern:nil keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassClientError)]; [objectManager addResponseDescriptor:errorResponseDescriptor]; 

然后你可以从你的失败块中访问它:

 failure:^(RKObjectRequestOperation *operation, NSError *error) { NSLog(@"errorMessage: %@", [[error userInfo] objectForKey:RKObjectMapperErrorObjectsKey]); } 

这使用内置的RKErrorMessage类,尽pipe您可以使用其他字段创build您自己的自定义类。

使用Restkit v0.2x,你可以用[ Swift ]的方式将你想要的所有JSON属性映射到现有的RKErrorMessage.userInfo Dictionary属性中:

 let errorMapping = RKObjectMapping(forClass: RKErrorMessage.self); errorMapping.addPropertyMapping(RKAttributeMapping(fromKeyPath: nil, toKeyPath: "userInfo")); let errorResponseDescriptor = RKResponseDescriptor( mapping: errorMapping, method: RKRequestMethod.Any, pathPattern: nil, keyPath: "error", //or nil, according to your json response statusCodes: RKStatusCodeIndexSetForClass(UInt(RKStatusCodeClassClientError))) ); 

所以,你可以像这样映射一个错误的JSON响应:

 { "error": { "message": "Error message", "cause": "...", "code": "my_error_code", "url": "..." ... } } 

并在failureclosures中检索具有所有属性的RKErrorMessage ,如下所示:

 failure: { (operation, error) -> Void in if let errorMessage = error.userInfo?[RKObjectMapperErrorObjectsKey]?.firstObject as? RKErrorMessage{ let message = errorMessage.userInfo["message"] as! String; let code = errorMessage.userInfo["code"] as! String; ... } } 

我希望这可以帮助一个人!

如果一个对象返回,你的委托应该调用这个方法:

 - (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects {} 

在这个方法中,你应该调用你的“错误”类的实例,并根据需要映射“代码”和“消息”。

处理错误的更简单的方法是使用:

 - (void)objectLoader:(RKObjectLoader*)objectLoader didFailWithError:(NSError*)error { if(objectLoader.response.statusCode == 401) { ... 

并在该方法中显示必要的错误消息。