AFNetworkingでJSONを取得する際の問題

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にアクセスしようとしましたが、それは完璧にうまくいきます...

19
この問題をどうやって解決しますか?データは?
追加された 著者 Matrosov Alexander,

4 答え

これは混乱しており、適切に文書化/設計する方法を理解しようとしていましたが、 application/json Accept ヘッダーを設定する必要があります>。

AFJSONRequestOperation を登録すると、「JSON要求であれば、それを調べて処理します」というメッセージが表示されます。リクエストがJSONであることを暗示する方法は、適切な Accept ヘッダーを設定するか、 .json を拡張機能として追加することです。現在のところ、要求は操作クラスのリストを通過していますが、 AFHTTPRequestOperation NSData の応答オブジェクトタイプログ)。

混乱については申し訳ありません!

34
追加された
@センドア:あまりにも動作します!ありがとう
追加された 著者 Claus,
ここでクラスを登録し、適切な受け入れヘッダを設定する必要があります。
追加された 著者 jianpx,
レスポンスヘッダーを変更するためにサーバーにアクセスできない場合は、Ben Hが提案したソリューションをさらに試してみてください:id payload = [NSJSONSerialization JSONObjectWithData:JSON options:NSJSONWritingPrettyPrinted error:nil];それは私のために働いた。
追加された 著者 Sendoa,
マットありがとう!これは本当に助けになりました - 今は魅力のように動作します!
追加された 著者 Goeran,

ここで私のアプリケーションがJSONを送受信するために追加しなければならなかった3行があります:

 httpClient.parameterEncoding = AFJSONParameterEncoding;
 [httpClient setDefaultHeader:@"Accept" value:@"application/json"];
 [httpClient registerHTTPOperationClass:[AFJSONRequestOperation class]];
20
追加された
[httpClient setDefaultHeader:@ "Accept" value:@ "application/json"]; は、 "要求されたリソースの適切な表現---このサーバでは見つかりませんでした" 。これのもう一つの部分はありますか?
追加された 著者 Full Decent,
これは魅力のように私のために働いた!ありがとう!
追加された 著者 Jasdeep Singh,
サーバーがJSONを提供していないように聞こえます。
追加された 著者 Tylerc230,

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

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

   NSLog(@"Fetched: %@", payload);
}
11
追加された
同じことを..しかし、私はそれは私の残りのクライアントを使用してすべてのクラスは、このjsonデシリアライズコードを呼び出す必要があります少しイライラすることを見つける..私はすべて私のRESTのシネルートクラス
追加された 著者 abbood,
私はそれにアクセスできないので、サーバーの応答ヘッダーを変更できませんでした。サーバーは "application/json"ではなく "text/html"で応答していました。あなたの提案は魅力のように機能します。ありがとう!!!
追加された 著者 Sendoa,

私は同じ問題を抱えていましたが、@ Tylerc230の答えのような Accept ヘッダーを追加した後、受信した "text/html" 予想されるコンテンツタイプであるため、 AFJSONRequestOperation.m acceptableContentTypes 機能に @ "text/html" を追加しました。

0
追加された
JavaScript - 日本のコミュニティ
JavaScript - 日本のコミュニティ
2 参加者の

日本人コミュニティのjavascript