2012-02-06 34 views
19

我正在嘗試使用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> 

任何暗示我在做什麼wr ong將不勝感激:)我試圖訪問Twitter API,並且工作完全正常...

+0

你如何解決這個問題?有數據? – 2014-02-26 17:26:14

回答

34

這是令人困惑的,我一直在努力弄清楚如何正確地文檔/設計更好,但你需要將您的請求的Accept標頭設置爲application/json

註冊AFJSONRequestOperation表示「任何通過的請求,我會查看並處理它是否是JSON請求」。提示請求是JSON的方式是設置適當的Accept標頭,或者添加.json作爲擴展名。現在,請求正在執行操作類的列表,但它只捕獲AFHTTPRequestOperation,其響應對象類型爲NSData(您在日誌中看到的內容)。

抱歉有關混淆!

+2

謝謝mattt!這真的有幫助 - 現在它就像一個魅力! – Goeran 2012-02-06 17:07:58

+2

如果您無法訪問服務器以更改響應頭,則可以嘗試Ben H提出的解決方案: id payload = [NSJSONSerialization JSONObjectWithData:JSON options:NSJSONWritingPrettyPrinted error:nil]; 它爲我工作。 – Sendoa 2013-07-11 08:46:12

+0

@Sendoa:那也行!謝謝 – Claus 2013-07-17 15:26:06

20

這裏有3條線路我不得不添加讓我的應用程序發送和接收JSON:

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

添加此行'[httpClient setDefaultHeader:@「Accept」value:@「application/json」];'正在給我「請求資源的適當表示---在此服務器上找不到」。這是另一部分嗎? – 2012-07-05 07:54:04

+0

聽起來像服務器沒有提供JSON。 – Tylerc230 2012-07-10 22:07:53

+1

這對我來說就像一個魅力!謝謝! – 2013-02-07 04:31:59

11

如果您正在使用自定義接受頭,像我,AFNetworking將無法識別你正在請求json,就像mattt解釋的那樣。圍繞這一方法是簡單地將數據轉換成JSON對象在完成塊:

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

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

我無法更改服務器響應標題,因爲我無法訪問它。服務器用「text/html」而不是「application/json」來響應。你的建議很有魅力。謝謝!!! – Sendoa 2013-07-11 08:43:54

+0

同樣在這裏..但是,我覺得有點令人沮喪,所有使用我的休息客戶端的類將不得不調用這個JSON反序列化代碼..我希望我可以把所有這些配置的東西都放到我的REST singelton類 – abbood 2013-09-19 02:28:50

0

我有同樣的問題,但之後我加入了Accept頭像在@ Tylerc230答案,請求啓動失敗由於收到的格式"text/html"未處於預期內容類型,因此我在acceptableContentTypes函數AFJSONRequestOperation.m中添加了@"text/html"