2013-03-11 57 views
5

我正在编写一个与应用程序交互以更新用户配置文件的iOS应用程序。为了更新一个用户的姓名,iOS应用提出的请求具有以下格式的主体:无法处理成功的204响应并使用RestKit正确映射失败响应

{"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,它被视为失败,并且错误代码正确映射到我的Servi ceError对象?

在此先感谢您提供的任何帮助。

回答

2

的完整列表,请参阅wikipedia的问题也通过添加一个响应描述处理204解决:

RKResponseDescriptor *successResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:[RKObjectMapping mappingForClass:nil] 
                           method:RKRequestMethodPUT 
                          pathPattern:nil 
                           keyPath:nil 
                          statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 
[manager addResponseDescriptor:successResponseDescriptor]; 
0

代码204不是错误,任何2xx状态都被视为成功。 204意味着'没有内容',这是一个完全有效的回应。 如果您希望restkit将其视为错误,请确保抛出3xx,4xx或5xx错误。在你的情况下,你正在使用一个RKStatusCodeClassClientErrorm,这将建议你应该抛出一个4xx错误。

的错误代码

+0

我想你误会了。我知道204是一个有效的回应。问题是让代码将204视为成功,同时还添加了适当的响应描述符,以便在收到400时将错误代码映射回来。 – Kathleen 2014-05-11 00:13:29