来自服务器的Restkit JSON错误响应消息

问题描述 投票:0回答:4

我花了很多时间来解决这个问题。我使用 Restkit 0.9.3 和对象映射 2.0。所有数据均采用 JSON 格式。我可以正确地进行 GET、POST、PUT 和 DELETE 操作,这是我没有正确捕获和映射的响应主体..

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

{
  "code": "401",
  "message": "Unauthorized"
}

如何正确映射此 JSON?我已经尝试了很多方法并且可以使用一些指导 - 或者请给出一个示例。

ios json response restkit
4个回答
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
类,尽管您可以使用其他字段创建自己的自定义类。


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
}

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

我希望这对某人有帮助!


0
投票

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

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

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

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

- (void)objectLoader:(RKObjectLoader*)objectLoader didFailWithError:(NSError*)error {

if(objectLoader.response.statusCode == 401)
{ ...

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

© www.soinside.com 2019 - 2024. All rights reserved.