无法处理成功的204响应并使用RestKit正确映射失败的响应

时间:2013-03-11 20:31:51

标签: ios restkit

我正在编写一个与服务交互以更新用户个人资料的iOS应用。为了更新用户名,iOS应用程序将使用以下格式的正文发出请求:

 {"name" : {"first" : "FIRSTNAMEGOESHERE", "lastName":"LASTNAMEGOESHERE"}}

在请求主体有效的情况下(即,提供了名字和姓氏),服务返回204(无内容)状态代码和空响应主体。

如果请求正文无效(例如缺少名字等),该服务将返回状态代码400和响应正文,格式如下:

{"code":"ERRORCODEHERE"}

iOS应用程序正在使用RestKit,我一直无法弄清楚如何正确处理成功和失败案例。如果我用这个:

- (void)updateUserName
{
    RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[[NSURL alloc] initWithString:@"http://someqaserver:8080"]];
    [objectManager setRequestSerializationMIMEType:RKMIMETypeJSON];

    RKObjectMapping *userMapping = [RKObjectMapping requestMapping];
    [userMapping addAttributeMappingsFromDictionary:@{@"firstName" : @"first", @"lastName" : @"last"}];

    RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:userMapping objectClass:[OurUser class]                                       rootKeyPath:@"name"];

    [objectManager addRequestDescriptor:requestDescriptor];

    [objectManager putObject:[OurUser getCurrentUser]
                   path:@"/mobile/profile/name"
                   parameters:nil
                   success:^(RKObjectRequestOperation *operation, RKMappingResult *result)
                   {
                     NSLog(@"Success!");
                   }
                   failure:^(RKObjectRequestOperation *operation, NSError *error)
                   {
                     NSLog(@"Fail!");
                   }];
}

这显然不适用于错误情况,但在从服务器返回204的情况下,它确实成功执行了成功块。

如果我在调用putObject之前添加以下代码,则错误处理有效,但现在有效的204情况被视为失败:

    RKObjectMapping *errorMapping = [RKObjectMapping mappingForClass:[ServiceError class]];
    [errorMapping addAttributeMappingsFromDictionary:@{@"code" : @"errorCode"}];
    RKResponseDescriptor *errorDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:errorMapping pathPattern:nil keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassClientError)];
    [objectManager addResponseDescriptor:errorDescriptor];

这似乎发生了,因为接受的HTTP状态代码现在设置为提供的响应描述符,而204不是其中之一(或者可能是其他的?)

我怎样才能这样做: 1.)如果返回204,则视为成功 2.)如果返回4XX,它被视为失败并且错误代码正确映射到我的ServiceError对象?

提前感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:2)

通过添加响应描述符来处理204:

,解决了这个问题
RKResponseDescriptor *successResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:[RKObjectMapping mappingForClass:nil]
                                                                                               method:RKRequestMethodPUT
                                                                                          pathPattern:nil
                                                                                              keyPath:nil
                                                                                          statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[manager addResponseDescriptor:successResponseDescriptor];

答案 1 :(得分:0)

代码204不是错误,任何2xx状态都被视为成功。 204表示“无内容”,这是完全有效的回复。 如果您希望restkit将其视为错误,请确保抛出3xx,4xx或5xx错误。在您的情况下,您使用的是RKStatusCodeClassClientErrorm,它会建议您抛出4xx错误。

有关错误代码的完整列表,请参阅wikipedia