2012-02-06 60 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"