9

次のメッセージを AFHTTPClient のインスタンスに送信しています。成功ブロックが Foundation オブジェクト (辞書) に送信されることを期待していますが、デバッガーは JSON が _NSCFData オブジェクトであることを示しています。 SO に関するこの質問では、Accept ヘッダーを「application/json」に設定する必要があると述べています。私はそうしていますが、AFNetworking はまだ応答本文の JSON をデコードしていません。NSJSONSerialization を使用して自分で json をデコードすると、期待どおりに NSDictionary が得られます。私は何を間違っていますか?

[client setDefaultHeader:@"Accept" value:@"application/json"];
[client postPath:@"/app/open_connection/"
  parameters:params
     success:^(AFHTTPRequestOperation *operation, id JSON) {
         NSLog(@"successful login! %@", [JSON valueForKeyPath:@"status"]);
     }
     failure:^(AFHTTPRequestOperation *operation, NSError *error) {
         NSLog(@"error opening connection");
         NSAlert *alert = [NSAlert alertWithError:error];
         [alert runModal];
     }
];

注: Django を使用して Python でサーバーをプログラミングしています。応答のコンテンツ タイプは「application/json」です。

4

2 に答える 2

6

および JSON API を使用しているAFHTTPClient場合は、通常、次の 3 つの設定をすべて設定する必要があります。

httpClient.parameterEncoding = AFJSONParameterEncoding;
[httpClient setDefaultHeader:@"Accept" value:@"application/json"];
[httpClient registerHTTPOperationClass:[AFJSONRequestOperation class]];

これで、クライアントを使用してリクエストを行うと、レスポンスを JSON として解析することがわかります。

[httpClient postPath:@"/app/open_connection/"
          parameters:params
             success:^(AFHTTPRequestOperation *operation, id response) {
                 NSLog(@"JSON! %@", response);
             }
             failure:^(AFHTTPRequestOperation *operation, NSError *error) {
             }];

ここにも私が発見したトリックがあります。オブジェクトでは、NSErrorそれを解析してエラー メッセージを取得できます (HTTP 応答に JSON エラー メッセージが含まれている場合)。

failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSDictionary *JSON =
    [NSJSONSerialization JSONObjectWithData: [error.localizedRecoverySuggestion dataUsingEncoding:NSUTF8StringEncoding]
                                    options: NSJSONReadingMutableContainers
                                      error:nil];
           failureCallback(JSON[@"message"]);
}
于 2013-04-13T18:17:26.573 に答える