首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >postPath AFHTTPClient中的JSON响应

postPath AFHTTPClient中的JSON响应
EN

Stack Overflow用户
提问于 2012-11-15 01:15:58
回答 3查看 5.6K关注 0票数 6

我刚刚切换到RestKit 0.2,我现在使用的是新的"HttpClient“,它基本上就是一个AFHTTPClient。我有这行代码:

代码语言:javascript
复制
RKObjectManager* objectManager = [RKObjectManager sharedManager];
NSDictionary* params = [[NSDictionary alloc] initWithObjectsAndKeys: login, @"username", password, @"password", nil];

[[objectManager HTTPClient]postPath:@"users/login/?format=json" parameters:params
    success:^(AFHTTPRequestOperation *operation, id responseObject)
    {
        //reponseObject vs operation.response
        NSLog(@"%@", responseObject);
    }
    failure:^(AFHTTPRequestOperation *operation, NSError *error)
    {
        NSLog(@"ERROR");
    }];

此POST调用返回一个JSON响应,格式为:{"api_key":"....","username":"...."}。就这么简单。

在切换到0.2之前,我可以通过执行以下操作来获取响应中的api_key密钥:

代码语言:javascript
复制
 [[RKClient sharedClient] post:@"/users/login/?format=json" usingBlock:^(RKRequest *request)
 {
    request.onDidLoadResponse = ^(RKResponse *response)
    {
        id parsedResponse = [response parsedBody:NULL];
        NSString *apiKey = [parsedResponse valueForKey:@"api_key"];
    }
  }.....];

http://restkit.org/api/master/Classes/RKResponse.html

但现在,我不能这样做,如果我在responseObject上执行NSLog,我会得到:

<7b227265 61736f6e 223a2022 41504920 4b657920 666f756e 64222c20 22617069 5f6b6579 223a2022 61356661 65323437 66336264 35316164 39396338 63393734 36386438 34636162 36306537 65386331 222c2022 73756363 65737322 3a207472 75657d>

奇怪的是如果我这样做了:

代码语言:javascript
复制
        NSLog(@"%@", operation.responseString);

我确实有JSON (在NSString中)。

所以有两个问题:

1)为什么打印responseObject会显示十六进制代码,而不是实际的JSON响应?

2)为什么我执行operation.responseString会显示实际的Response对象?有没有办法从JSON中解析出ResponseObject格式的实际数据?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-01 14:25:36

如果我没记错的话,您看到的是调用成功块时提供给您的NSData中的原始字节。

你发布的十六进制是这样的:

{"reason": "API Key found", "api_key": "a5fae247f3bd51ad99c8c97468d84cab60e7e8c1", "success": true}

第二个NSLog显示您想要的内容的原因是,%@格式字符串调用您传递给它的对象的描述(如果我在这里错了,请纠正我,所以),并且NSData可能知道它下面是一个字符串。

因此,我们来看看如何获得JSON。这真的很简单。一旦你有了响应对象,你就可以这样做了:

NSDictionary* jsonFromData = (NSDictionary*)[NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:&error];

这将为您做的是使用返回一个NSDictionary来对JSON中的根对象进行编码,然后字典中的每个值都将是NSStringNSNumberNSArrayNSDictionaryNSNull类型。有关文档,请参阅NSJSONSserialization

NSJSONReadingMutableContainers使字典和数组成为可变的。这只是我的代码遗留下来的。

希望您使用的是iOS 5或更高版本,否则您将需要找到另一种解析解决方案。

票数 11
EN

Stack Overflow用户

发布于 2012-12-01 19:08:08

AFNetworking应该实例化一个AFJSONRequestOperation。它可能会创建一个基本的AFHTTPRequestOperation (检查[operation class]),从而产生一个NSData对象作为响应。

确保在AFHTTPClient子类(InitWithBaseURL)的初始化方法中注册操作类:

代码语言:javascript
复制
[self registerHTTPOperationClass:[AFJSONRequestOperation class]];

// Accept HTTP Header; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1
[self setDefaultHeader:@"Accept" value:@"application/json"];

您也可以尝试直接使用AFJSONRequestOperation,如下所示:

代码语言:javascript
复制
NSURLRequest *request = [[objectManager HTTPClient] requestWithMethod:@"POST" path:@"users/login/?format=json" parameters:params];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
    NSLog(@"JSON: %@", JSON);
} failure:nil];
[[objectManager HTTPClient] enqueueHTTPRequestOperation:operation];
票数 17
EN

Stack Overflow用户

发布于 2012-12-04 23:29:46

代码语言:javascript
复制
success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSData *responseData = operation.HTTPRequestOperation.responseData;
    id parsedResponse = [RKMIMETypeSerialization objectFromData:responseData    MIMEType:RKMIMETypeJSON error:nil];
    NSString *apiKey = [parsedResponse valueForKey:@"api_key"]
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13383784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档