サービスとやり取りしてユーザーのプロファイルを更新する 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 つではない (または別のものである可能性がある) ために発生するようです。
どうすれば取得できますか?
ご協力いただきありがとうございます。