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": "..." ... } }
并在failure
closures中检索具有所有属性的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) { ...
并在该方法中显示必要的错误消息。