使用AFNetworking检索JSON的问题

Goe*_*ran 19 json afnetworking

我正在尝试使用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"}
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下代码来检索此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]);
}];
Run Code Online (Sandbox Code Playgroud)

在模拟器中运行时,控制台显示以下输出:

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>
Run Code Online (Sandbox Code Playgroud)

任何关于我做错的提示都会非常感激:)我尝试访问Twitter API并且工作得很好......

mat*_*ttt 34

这很令人困惑,而且我一直试图弄清楚如何更好地记录/设计,但是你需要Accept为请求设置标题application/json.

注册AFJSONRequestOperation说"任何通过的请求,我将查看并处理它是否是JSON请求".您提示请求是JSON的方式是设置适当的Accept标头,或添加.json为扩展名.现在,请求正在通过操作类列表,但它只是捕获AFHTTPRequestOperation,它具有响应对象类型NSData(您在日志中看到的内容).

对此感到抱歉!

  • 谢谢mattt!这真的很有帮助 - 现在它就像一个魅力! (2认同)
  • 如果您无权访问服务器以更改响应头,则可以尝试Ben H提出的解决方案:id payload = [NSJSONSerialization JSONObjectWithData:JSON options:NSJSONWritingPrettyPrinted error:nil]; 它对我有用. (2认同)

Tyl*_*230 20

以下是为了让我的应用程序发送和接收JSON而必须添加的3行:

 httpClient.parameterEncoding = AFJSONParameterEncoding;
 [httpClient setDefaultHeader:@"Accept" value:@"application/json"];
 [httpClient registerHTTPOperationClass:[AFJSONRequestOperation class]];
Run Code Online (Sandbox Code Playgroud)


Ben*_*n H 11

如果你正在使用自定义接受标题,就像我一样,AFNetworking将无法识别你正在请求json,就像mattt解释的那样.解决这个问题的一种方法是简单地将数据转换为完成块中的json对象:

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

   NSLog(@"Fetched: %@", payload);
}
Run Code Online (Sandbox Code Playgroud)