【问题标题】:Mapping a primitive json response with RestKit v0.21使用 RestKit v0.21 映射原始 json 响应
【发布时间】:2013-10-29 14:28:40
【问题描述】:

我有一个 API,需要我发布一个复杂的 JSON 对象。 API 保存并使用原始 ID(或错误对象)进行响应。我无法映射原始 ID。有任何想法吗?为简单起见,下面的示例没有进行 POST 对象映射,但我的一些 API 调用也需要这样做。

我看到了使用 RestKit 构建请求并将其传递给 AFNetworking 的建议,但这不会解析可能的错误返回对象。

RKObjectMapping* map = [RKObjectMapping mappingForClass:[MyPrimitiveResponse class]];
[map addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:nil toKeyPath:@"success"]];

RKResponseDescriptor *errDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:[MyErrorResponse objectMap] method:RKRequestMethodGET  pathPattern:nil keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassServerError)];

RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:map method:RKRequestMethodGET pathPattern:nil keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

NSURL *URL = [NSURL URLWithString:apiUrl];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
RKObjectRequestOperation *objectRequestOperation = [[RKObjectRequestOperation alloc] initWithRequest:request responseDescriptors:@[ errDescriptor, responseDescriptor ]];
[objectRequestOperation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
    RKLogInfo(@"Load collection of Articles: %@", mappingResult.array);
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
    RKLogError(@"Operation failed with error: %@", error);
}];

[objectRequestOperation start];

我在调试器中收到以下错误:

2013-10-29 10:23:15.196 TestParser[6988:70b] E app:MyHomeViewController.m:54 Operation failed with error: Error Domain=org.restkit.RestKit.ErrorDomain Code=-1017 "Loaded an unprocessable内容类型为 'application/json' 的响应 (200)" UserInfo=0x8daca20 {NSErrorFailingURLKey=....., NSUnderlyingError=0x8db4cd0 "操作无法完成。(Cocoa 错误 3840.)", NSLocalizedDescription=加载了一个不可处理的内容类型为“application/json”的响应(200)}

更新:
这是我处理这种情况的最后一段代码。它可能对其他人有用...

// Manually Map Request to JSON & send to server
NSDictionary *parameters = [RKObjectParameterization parametersWithObject:payload requestDescriptor:[payload.class requestDescriptor] error:&error];
NSMutableURLRequest* request = [self.apiManager requestWithObject:nil method:RKRequestMethodPOST path:url parameters:parameters];

RKHTTPRequestOperation *requestOperation = [[RKHTTPRequestOperation alloc] initWithRequest:request];
[requestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    unichar firstChar = [operation.responseString characterAtIndex:0];
    NSData *newData;
    if (firstChar != '{' && firstChar != '[') {
        // Force into JSON array so it can be parsed normally
        newData = [[[@"[" stringByAppendingString:operation.responseString] stringByAppendingString:@"]"] dataUsingEncoding:NSUTF8StringEncoding]; 
    } else {
        newData = operation.responseData;
    }

    // Parse JSON response into native object, whether primitive NSNumber (integer or boolean) response or a full fledged JSON error object.
    RKResponseDescriptor *errDescriptor = [MyErrorResponse responseDescriptor];
    RKObjectResponseMapperOperation* mapper = [[RKObjectResponseMapperOperation alloc] initWithRequest:request response:operation.response data:newData responseDescriptors:@[errDescriptor, [payload.class responseDescriptor]]];
    [mapper setDidFinishMappingBlock:^(RKMappingResult *mappingResult, NSError *error) {
        if (mappingResult) { //Success
            RKLogInfo(@"Load response: %@", mappingResult.firstObject);
        } else {
            RKLogError(@"Operation failed with error: %@", error);
        }
    }];
    [mapper start];

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    RKLogError(@"Operation failed with error: %@", error);
}];

[requestOperation start];

【问题讨论】:

    标签: json restkit restkit-0.20


    【解决方案1】:

    我看到了使用 RestKit 构建请求并将其传递给 AFNetworking 的建议

    是的,这样做。

    但这不会解析可能的错误返回对象

    没错,但您可以使用 RestKit 中的映射操作来处理它。或者,如果错误响应比较简单,只需使用NSJSONSerialization(或类似的)来转换响应。


    “原始 ID”应该可以使用 nil-keypath 映射进行映射。但是,如果错误响应没有被映射回 POST 请求中使用的源对象,您在映射错误响应时可能仍然会遇到问题。

    【讨论】:

    • 您能解释一下您回复的最后一部分吗?应该如何构造源对象以包含响应对象?我应该在某处添加错误元素并映射该键而不是 nil 吗?
    • 我会选择第一个选项。您可能会遇到第二个问题。
    猜你喜欢
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多