我刚刚切换到RestKit 0.2,我现在使用的是新的"HttpClient“,它基本上就是一个AFHTTPClient。我有这行代码:
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密钥:
[[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>
奇怪的是如果我这样做了:
NSLog(@"%@", operation.responseString);我确实有JSON (在NSString中)。
所以有两个问题:
1)为什么打印responseObject会显示十六进制代码,而不是实际的JSON响应?
2)为什么我执行operation.responseString会显示实际的Response对象?有没有办法从JSON中解析出ResponseObject格式的实际数据?
发布于 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中的根对象进行编码,然后字典中的每个值都将是NSString、NSNumber、NSArray、NSDictionary或NSNull类型。有关文档,请参阅NSJSONSserialization。
NSJSONReadingMutableContainers使字典和数组成为可变的。这只是我的代码遗留下来的。
希望您使用的是iOS 5或更高版本,否则您将需要找到另一种解析解决方案。
发布于 2012-12-01 19:08:08
AFNetworking应该实例化一个AFJSONRequestOperation。它可能会创建一个基本的AFHTTPRequestOperation (检查[operation class]),从而产生一个NSData对象作为响应。
确保在AFHTTPClient子类(InitWithBaseURL)的初始化方法中注册操作类:
[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,如下所示:
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];发布于 2012-12-04 23:29:46
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"]
}https://stackoverflow.com/questions/13383784
复制相似问题