我已经花了很多时间来解决这个问题。我使用Restkit 0.9.3与Object Mapping 2.0。所有数据都是JSON。我可以正确地进行GET,POST,PUT和DELETE操作,它是我没有捕获的响应体并且正确映射..
所以我的问题是,当出现问题时,我的restful api会返回错误。我想用restkit映射这些错误,fx返回错误:
{ “code”:“401”, “消息”:“未经授权” }
如何正确映射这个json?我已经尝试过很多东西并且可以使用一些指导 - 或者请举例说明。
答案 0 :(得分:29)
对于RestKit v0.20
假设您的HTTP正文为:
{"error": "..."}
你创建了一个映射和描述符:
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
类,但您可以使用其他字段创建自己的自定义类。
答案 1 :(得分:10)
对于版本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
}
答案 2 :(得分:5)
使用 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": "..."
...
}
}
在RKErrorMessage
闭包中检索包含所有属性的failure
,如下所示:
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;
...
}
}
我希望这对某人有帮助!
答案 3 :(得分:0)
如果返回一个对象,你的委托应该调用这个方法:
- (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects {}
在这种方法中,您应该调用“错误”类的实例,并根据需要映射“代码”和“消息”。
处理错误的一种更简单的方法是使用:
- (void)objectLoader:(RKObjectLoader*)objectLoader didFailWithError:(NSError*)error {
if(objectLoader.response.statusCode == 401)
{ ...
并在该方法中显示必要的错误消息。