无法使用 RestKit 处理成功的 204 响应并正确映射失败的响应
Posted
技术标签:
【中文标题】无法使用 RestKit 处理成功的 204 响应并正确映射失败的响应【英文标题】:Can't handle successful 204 response and correctly map failing response using RestKit 【发布时间】:2013-03-11 20:31:50 【问题描述】:我正在编写一个与服务交互以更新用户个人资料的 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 对象?
提前感谢您提供的任何帮助。
【问题讨论】:
【参考方案1】:通过添加响应描述符来处理 204 也解决了问题:
RKResponseDescriptor *successResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:[RKObjectMapping mappingForClass:nil]
method:RKRequestMethodPUT
pathPattern:nil
keyPath:nil
statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[manager addResponseDescriptor:successResponseDescriptor];
【讨论】:
【参考方案2】:代码 204 不是错误,任何 2xx 状态都被视为成功。 204 表示“无内容”,这是一个完全有效的响应。 如果您希望 restkit 将其视为错误,请确保您抛出 3xx、4xx 或 5xx 错误。在您的情况下,您使用的是 RKStatusCodeClassClientErrorm ,这表明您应该抛出 4xx 错误。
有关错误代码的完整列表,请参阅 wikipedia
【讨论】:
我想你误会了。我知道 204 是一个有效的响应。问题是让此代码将 204 视为成功,同时还添加适当的响应描述符,以便在收到 400 时将错误代码映射回来。以上是关于无法使用 RestKit 处理成功的 204 响应并正确映射失败的响应的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Kotlin Coroutines 在 Retrofit 中处理 204 响应?