我正在编写一个与应用程序交互以更新用户配置文件的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对象?
在此先感谢您提供的任何帮助。
我想你误会了。我知道204是一个有效的回应。问题是让代码将204视为成功,同时还添加了适当的响应描述符,以便在收到400时将错误代码映射回来。 – Kathleen 2014-05-11 00:13:29