我正在编写一个与服务交互以更新用户个人资料的 iOS 应用程序。为了更新用户名,iOS 应用 PUT 请求具有以下格式的正文:
{"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 对象?
提前感谢您提供的任何帮助。