2012-02-06 11 views
19

AFNetworkingでJSONデータを取得しようとしています。シミュレータでAFNetworkingで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]); 
}]; 

実行:

私のサーバーコンポーネント(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データを取得するために、次のコードを使用してみてくださいコンソールには次の出力が表示されます。

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> 

私がやっていることについてのヒントwr私はTwitter APIにアクセスしようとしましたが、それは完全に正常に動作します...

+0

どのようにこの問題を解決しますか?データは? –

答えて

34

これは混乱しています。私は適切に文書化する方法を理解しようとしてきましたが、リクエストのAcceptヘッダーをapplication/jsonに設定してください。

AFJSONRequestOperationを登録すると、「すべてのリクエストは、JSONリクエストかどうかを調べて処理します」と表示されます。リクエストがJSONであることを暗示する方法は、適切なAcceptヘッダーを設定するか、または.jsonを拡張子として追加することです。今は要求が操作クラスのリストを調べていますが、応答オブジェクトのタイプがNSData(ログに表示されているもの)のAFHTTPRequestOperationしか検出されません。

ご迷惑をおかけして申し訳ありません。ここで

+2

ありがとうございました!これは本当に助けになりました - 今は魅力のように動作します! – Goeran

+2

応答ヘッダーを変更するためにサーバーにアクセスできない場合は、Ben Hが提案したソリューションをさらに試してみてください。 id payload = [NSJSONSerialization JSONObjectWithData:JSON options:NSJSONWritingPrettyPrinted error:nil]; それは私のために働いた。 – Sendoa

+0

@Sendoa:それも動作します!ありがとう – Claus

20

は、私は私のアプリは、JSONを送受信するために取得するために追加する必要がありました3線です:カスタムを使用している場合

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

この行 '' httpClient setDefaultHeader:@ "Accept value:@" application/json "];を追加すると、"要求されたリソースの適切な表現---このサーバでは見つかりませんでした "が表示されます。これのもう一つの部分はありますか? –

+0

サーバーがJSONを提供していないように私に聞こえます。 – Tylerc230

+1

これは私にとって魅力のように働いた!ありがとう! –

11

私はのように、ヘッダーを受け入れ、AFNetworkingはそれを認識しませんmatttが説明したように、あなたはjsonを要求しています。これを回避する一つの方法は、単にあなたの完了ブロックでJSONオブジェクトにデータを変換することです:

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

    NSLog(@"Fetched: %@", payload); 
} 
+1

私はそれにアクセスできないので、サーバレスポンスヘッダを変更できませんでした。サーバーは "application/json"ではなく "text/html"で応答していました。あなたの提案は魅力のように機能します。ありがとう!!! – Sendoa

+0

ここに同じ..しかし、私はそれは私の残りのクライアントを使用してすべてのクラスは、このjsonデシリアライズコードを呼び出す必要があります少しイライラすることを見つける..私はすべて私のREST Singeltonクラス – abbood

0

私は同じ問題があったが、私はTylerc230答え@のようにAcceptヘッダに何かを追加した後、要求の開始が失敗します受け取ったフォーマット"text/html"は予期したコンテンツタイプではなかったので、AFJSONRequestOperation.macceptableContentTypesファンクションに@"text/html"を追加しました。

関連する問題