RestKit POST响应错误的映射

时间:2013-10-09 14:37:01

标签: objective-c restkit-0.20

当我对对象进行POST时,响应映射到错误的对象。

// Resquest for post new article

RKObjectMapping* articleRequestMapping = [RKObjectMapping requestMapping];
[articleRequestMapping addAttributeMappingsFromDictionary:@{
                                                     @"title"   : @"title",
                                                     @"body"    : @"body",
                                                     }];

RKRequestDescriptor *requestDescriptorArticle = [RKRequestDescriptor
                                                 requestDescriptorWithMapping:articleRequestMapping
                                                 objectClass:[Article class]
                                                 rootKeyPath:nil
                                                 method:RKRequestMethodPOST];

[objectManager addRequestDescriptor:requestDescriptorArticle];


// Response for post new article 
// response.body={
//   "result": {
//     "ok": 1
//   }
// }

RKObjectMapping *resultMapping = [RKObjectMapping mappingForClass:[Result class]];
[resultMapping addAttributeMappingsFromDictionary:@{
                                                    @"ok"   :  @"ok"
                                                  }];

RKResponseDescriptor *resArticleCreate = [RKResponseDescriptor
                                          responseDescriptorWithMapping:resultMapping
                                          method:RKRequestMethodPOST
                                          pathPattern:[NSString stringWithFormat:@"%@%@",apiVersion,@"/articles"]
                                          keyPath:@"result"
                                          statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[objectManager addResponseDescriptor:resArticleCreate];

日志:

2013-10-09 07:05:43.335 TabbedDemo[35156:4703] D restkit.object_mapping:RKMapperOperation.m:378 Executing mapping operation for representation: {
    result =     {
        ok = 1;
    };
}
 and targetObject: <Article: 0x7d88670>

targetObject是Article ...,但它应该是Result ...

我在这里找到了旧的类似问题:https://github.com/RestKit/RestKit/issues/1081 我正在使用v0.21(主分支),现在我通过强制targetObject来解决它。

// normal one, but with wrong mapping object.

//    [[RKObjectManager sharedManager] postObject:article path:nil parameters:@{@"_csrf" : self._csrf}
//                                        success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult){
//                                            NSLog(@"result:%@",[mappingResult firstObject]);
//                                        }
//                                        failure:^(RKObjectRequestOperation *operation, NSError *error) {
//                                            NSLog(@"Hit error: %@", error);
//                                        }];

RKObjectRequestOperation *operation = [[RKObjectManager sharedManager] appropriateObjectRequestOperationWithObject:article
                                                                        method:RKRequestMethodPOST
                                                                        path:nil
                                                                        parameters:@{@"_csrf" : self._csrf}];
Result *r1 = [Result new];
operation.targetObject = r1;

[operation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
    NSLog(@"result:%@",[mappingResult firstObject]);
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
    NSLog(@"Hit error: %@", error);
}];

[operation start];

这是一个RestKit问题还是我做错了?

1 个答案:

答案 0 :(得分:1)

这是一个RestKit设计假设。它确实会在某些情况下导致问题,例如你的问题。在发布和对象时,RestKit将始终尝试将响应映射到同一个对象。

您的解决方案解决方案是一个不错的选择。

您也可以发布字典并将结果映射回该字典。

相关问题