Ios RESTKit-postObject:path:parameters:success:failure:method始终失败

Ios RESTKit-postObject:path:parameters:success:failure:method始终失败,ios,post,restkit-0.20,Ios,Post,Restkit 0.20,我正在尝试向服务器发送POST请求。我正在使用带有请求描述符的RESTKit: RKObjectMapping *messageRequestMapping = [RKObjectMapping requestMapping ]; [messageRequestMapping addAttributeMappingsFromArray:@[@"to", @"msg"]]; RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor

我正在尝试向服务器发送POST请求。我正在使用带有请求描述符的RESTKit:

RKObjectMapping *messageRequestMapping = [RKObjectMapping requestMapping ];
[messageRequestMapping addAttributeMappingsFromArray:@[@"to", @"msg"]];

RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:messageRequestMapping objectClass:[PostMessage class] rootKeyPath:nil method:RKRequestMethodAny];

[objectManager addRequestDescriptor:requestDescriptor];
// message response after a post
    RKObjectMapping *messageResponseForPostMapping = [RKObjectMapping mappingForClass:[PostMessage class]];
    [messageResponseForPostMapping addAttributeMappingsFromArray:@[@"success"]];

RKResponseDescriptor *messageResponseForPostDescriptor =
[RKResponseDescriptor responseDescriptorWithMapping:messageResponseForPostMapping
                                             method:RKRequestMethodPOST
                                        pathPattern:@"post"
                                            keyPath:@""
                                        statusCodes:[NSIndexSet indexSetWithIndex:200]]; 
[objectManager addResponseDescriptorsFromArray:@[messageResponseDescriptor, personResponseDescriptor, messageResponseForPostDescriptor]];
RKObjectMapping* mapping = [RKObjectMapping mappingForClass:<YOURCLASSHERE>];
...
RKResponseDescriptor * responseDescriptor = [RKResponseDescriptor
    responseDescriptorWithMapping:mapping
    method:RKRequestMethodPOST
    pathPattern:path keyPath:nil
    statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[objectManager addResponseDescriptor:responseDescriptor];
然后我使用
postObject:path:parameters:success:failure:

PostMessage *postMessage = [PostMessage new];
    postMessage.to = self.pickedPerson.name;
    postMessage.msg = message.messgaeContent;
    [[RKObjectManager sharedManager] postObject:postMessage path:@"/post" parameters:nil
                                        success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
                                            NSLog(@"SUCCES: message sent to server");

                                        }
                                        failure:^(RKObjectRequestOperation *operation, NSError *error) {
                                            NSLog(@"WARNING");
                                              }];
问题是,尽管我看到POST请求成功地到达了服务器,但总是调用失败块。当我用一个简单的REST客户端测试相同的POST请求时,我得到的状态代码是200

我得到的错误是:

Error Domain=org.restkit.restkit.ErrorDomain code=1001“没有与加载的响应匹配的响应描述符。”UserInfo=0x10c67adf0{NSLocalizedFailureReason=从URL的http://bla.com/post“,但未能匹配所有(0)响应描述符:,NSErrorFailingURLStringKey=http://bla.com/post,n错误失败键=http://bla.com/post,NSUnderlyingError=0x10c60add0“在搜索的键路径中未找到可映射的对象表示法。”,键路径=null,NSLocalizedDescription=没有与加载的响应匹配的响应描述符。}

我不确定是否必须设置响应脚本。 我不能像设置responseDescriptor时那样设置预期的状态代码吗

编辑: 我添加了一个响应描述符:

RKObjectMapping *messageRequestMapping = [RKObjectMapping requestMapping ];
[messageRequestMapping addAttributeMappingsFromArray:@[@"to", @"msg"]];

RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:messageRequestMapping objectClass:[PostMessage class] rootKeyPath:nil method:RKRequestMethodAny];

[objectManager addRequestDescriptor:requestDescriptor];
// message response after a post
    RKObjectMapping *messageResponseForPostMapping = [RKObjectMapping mappingForClass:[PostMessage class]];
    [messageResponseForPostMapping addAttributeMappingsFromArray:@[@"success"]];

RKResponseDescriptor *messageResponseForPostDescriptor =
[RKResponseDescriptor responseDescriptorWithMapping:messageResponseForPostMapping
                                             method:RKRequestMethodPOST
                                        pathPattern:@"post"
                                            keyPath:@""
                                        statusCodes:[NSIndexSet indexSetWithIndex:200]]; 
[objectManager addResponseDescriptorsFromArray:@[messageResponseDescriptor, personResponseDescriptor, messageResponseForPostDescriptor]];
RKObjectMapping* mapping = [RKObjectMapping mappingForClass:<YOURCLASSHERE>];
...
RKResponseDescriptor * responseDescriptor = [RKResponseDescriptor
    responseDescriptorWithMapping:mapping
    method:RKRequestMethodPOST
    pathPattern:path keyPath:nil
    statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[objectManager addResponseDescriptor:responseDescriptor];
由于服务器的响应是:

{
  "success" : "Message sent successfully."
}

它仍然会失败,并出现相同的错误。

错误消息告诉您

“在搜索的关键路径中未找到可映射的对象表示。”

因此,要么您给出了错误的响应描述符,要么您没有定义响应描述符。 给出正确的响应描述符应该可以解决这个问题

这是一个响应描述符示例:

RKObjectMapping *messageRequestMapping = [RKObjectMapping requestMapping ];
[messageRequestMapping addAttributeMappingsFromArray:@[@"to", @"msg"]];

RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:messageRequestMapping objectClass:[PostMessage class] rootKeyPath:nil method:RKRequestMethodAny];

[objectManager addRequestDescriptor:requestDescriptor];
// message response after a post
    RKObjectMapping *messageResponseForPostMapping = [RKObjectMapping mappingForClass:[PostMessage class]];
    [messageResponseForPostMapping addAttributeMappingsFromArray:@[@"success"]];

RKResponseDescriptor *messageResponseForPostDescriptor =
[RKResponseDescriptor responseDescriptorWithMapping:messageResponseForPostMapping
                                             method:RKRequestMethodPOST
                                        pathPattern:@"post"
                                            keyPath:@""
                                        statusCodes:[NSIndexSet indexSetWithIndex:200]]; 
[objectManager addResponseDescriptorsFromArray:@[messageResponseDescriptor, personResponseDescriptor, messageResponseForPostDescriptor]];
RKObjectMapping* mapping = [RKObjectMapping mappingForClass:<YOURCLASSHERE>];
...
RKResponseDescriptor * responseDescriptor = [RKResponseDescriptor
    responseDescriptorWithMapping:mapping
    method:RKRequestMethodPOST
    pathPattern:path keyPath:nil
    statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[objectManager addResponseDescriptor:responseDescriptor];
RKObjectMapping*mapping=[RKObjectMappingForClass:];
...
RKResponseDescriptor*responseDescriptor=[RKResponseDescriptor
responseDescriptorWithMapping:映射
方法:RKRequestMethodPOST
路径模式:路径键路径:nil
状态代码:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[objectManager addResponseDescriptor:responseDescriptor];

我实际上没有发现我的响应描述符有什么问题。
我处理这个问题的方法是更改服务器上的响应。服务器现在发送的响应代码不是json文件,而是201,RESTKit不再失败。

我认为响应结构与描述符的KVC模式不匹配。这是什么意思?我是RESTKit新手,所以我不太清楚响应结构应该与描述符的结构匹配。我添加了一个与响应匹配的响应描述符,但仍然失败,并出现相同的错误(我编辑了上面的问题),但我也添加了一个响应描述符。这与我从服务器得到的响应相匹配:
{“success”:“Message sent successfully.”}
但仍然失败您提到的是一个请求描述符。。。考虑一下:您发送一个请求,可能是一个带有json负载的post,用于修改某个实体;您可以为此定义一个请求描述符。服务器将执行该操作,并使用json负载返回其响应,该负载表示对应用程序有意义的任何内容;您可以为此定义一个响应描述符。希望这有帮助。那么你的意思是我一开始就不应该有请求描述符?我没有说过。如果您向服务器发送一些json负载(restkit将从您的对象中组装),您可能需要一个请求描述符。如果你发送了一些对象,比如说,你需要一个请求描述符;如果您收到一些对象,那么您还需要一个响应描述符。看我的编辑;这是不容易做到的,所以就试试看。如果你的服务器将对象包装在给定的键内(例如:<代码>结果< /代码>),那么你可能需要指定一个<代码>键路径。如果是这样的话,那么你必须有另一个处理它的响应描述符,即使你不打算这样做。正确的解决方案是使用RestKit创建要发送的请求,然后使用AFNetworking发送该请求(因为您不关心映射响应)。那么我应该如何准确地发送该请求呢?另外,我尝试添加映射,但总是失败。您知道我在responseDescriptor映射中做错了什么吗?
HTTPRequestOperationWithRequest:success:failure:
。您的代码看起来正常,需要查看跟踪日志以了解未找到/使用响应描述符的原因。您指定的此方法将在
[RKObjectManager sharedManager]
上运行?我把错误贴在了原来的问题上。或者你是说别的?不,这是一种网络方法。如果始终没有响应描述符与加载的响应匹配,则说明响应描述符路径错误,或者没有将描述符添加到对象管理器中。