19

AFNetworking で JSON データを取得しようとしています。

私のサーバー コンポーネント (PHP/ZendFramework) は、次の応答を返します。

>curl -i http://test.local:8080/public/appapi/testaction/format/json
HTTP/1.1 200 OK
Date: Mon, 06 Feb 2012 10:37:20 GMT
Server: Apache
X-Powered-By: PHP/5.3.8
Content-Length: 35
Content-Type: application/json
{"entries":"test","abcxxx":"test2"}

次のコードを使用して、この json データを取得しようとしています。

NSString *baseurl = @"http://test.local:8080";

NSString *path = @"/public/appapi/testaction/format/json";

AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:baseurl]];
[client registerHTTPOperationClass:[AFJSONRequestOperation class]];
[client setAuthorizationHeaderWithUsername:@"myusername" password:@"mypassword"];

[client getPath:path parameters:nil success:^(__unused AFHTTPRequestOperation *operation, id JSON) {

    //NSLog(@"sjson: %@", [JSON valueForKeyPath:@"entries"]);
    NSLog(@"sjson: %@", JSON);        
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error Code: %i - %@",[error code], [error localizedDescription]);
}];

シミュレーターで実行すると、コンソールに次の出力が表示されます。

2012-02-06 11:22:39.800 App[3642:15803] sjson: <6a736f6e 466c6963 6b724170 69287b22 6d657468 6f64223a 7b225f63 6f6e7465 6e74223a 22666c69 636b722e 74657374 2e656368 6f227d2c 2022666f 726d6174 223a7b22 5f636f6e 74656e74 223a226a 736f6e22 7d2c2022 6170695f 6b657922 3a7b225f 636f6e74 656e7422 3a223336 32306666 32343265 37323336 34633135 32373031 31353438 62393335 3066227d 2c202273 74617422 3a226f6b 227d29>

私が間違っていることについてのヒントは大歓迎です:)私はTwitter APIにアクセスしようとしましたが、それは完全にうまくいきます...

4

4 に答える 4

34

これは紛らわしく、適切に文書化/設計する方法を見つけようとしてきたものですがAccept、リクエストのヘッダーをに設定する必要がありますapplication/json

登録AFJSONRequestOperationすると、「JSON リクエストである場合は、通過するすべてのリクエストを確認して処理します」と表示されます。リクエストが JSON であることを示唆する方法は、適切なAcceptヘッダーを設定するか.json、拡張子として追加することです。現在、リクエストは操作クラスのリストを通過してAFHTTPRequestOperationいますが、応答オブジェクト タイプがNSData(ログに表示されているもの) である のみをキャッチします。

混乱してごめんなさい!

于 2012-02-06T16:52:41.473 に答える
20

アプリで JSON を送受信するために追加する必要があった 3 行を次に示します。

 httpClient.parameterEncoding = AFJSONParameterEncoding;
 [httpClient setDefaultHeader:@"Accept" value:@"application/json"];
 [httpClient registerHTTPOperationClass:[AFJSONRequestOperation class]];
于 2012-04-13T15:53:18.307 に答える
11

私のようにカスタムの受け入れヘッダーを使用している場合、マットが説明したように、AFNetworking は json を要求していることを認識しません。これを回避する 1 つの方法は、完了ブロックでデータを json オブジェクトに単純に変換することです。

^(AFHTTPRequestOperation *operation, id JSON)
{
   id payload = [NSJSONSerialization JSONObjectWithData:JSON options:NSJSONWritingPrettyPrinted error:nil];

   NSLog(@"Fetched: %@", payload);
}
于 2013-02-08T22:14:38.037 に答える