5

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

どうすれば取得できますか?

ご協力いただきありがとうございます。

4

2 に答える 2

2

この問題は、204 を処理する応答記述子も追加することで解決されました。

RKResponseDescriptor *successResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:[RKObjectMapping mappingForClass:nil]
                                                                                               method:RKRequestMethodPUT
                                                                                          pathPattern:nil
                                                                                              keyPath:nil
                                                                                          statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[manager addResponseDescriptor:successResponseDescriptor];
于 2014-05-11T00:15:57.123 に答える
1

コード 204 はエラーではなく、2xx ステータスはすべて成功と見なされます。204 は「コンテンツなし」を意味し、これは完全に有効な応答です。restkit がそれをエラーとして処理すると予想される場合は、必ず 3xx、4xx、または 5xx エラーをスローしてください。あなたの場合、4xxエラーをスローする必要があることを示唆する RKStatusCodeClassClientErrorm を使用しています。

エラーコードの完全なリストについては、ウィキペディアを参照してください

于 2013-10-25T07:18:03.200 に答える