【问题标题】:JSON Response in postPath AFHTTPClientpostPath AFHTTPClient 中的 JSON 响应
【发布时间】:2012-11-14 17:15:57
【问题描述】:

我刚刚切换到 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,我会得到:

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

        NSLog(@"%@", operation.responseString);

我确实显示了 JSON(在 NSString 中)。

那么两个问题:

1) 为什么打印的 responseObject 显示的是 HEX 代码,而不是实际的 JSON 响应?

2) 为什么如果我执行 operation.responseString 会显示实际的响应对象?有没有办法在从 JSON 解析后获取 ResponseObject 中的实际数据?

【问题讨论】:

    标签: objective-c restkit afnetworking restkit-0.20


    【解决方案1】:

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

    确保在 AFHTTPClient 子类 (initWithBaseURL) 的 init 方法中注册操作类:

    [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];
    

    【讨论】:

    • +1 表示正确使用 AFNetworking。应该接受这个。
    【解决方案2】:

    如果我没记错的话,您看到的是调用成功块时提供给您的 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 中对根对象进行编码,然后字典中的每个值的类型将是 NSStringNSNumberNSArray、@987654331 @,或NSNull。有关文档,请参阅 NSJSONSserialization

    NSJSONReadingMutableContainers 使字典和数组可变。这只是我的代码的剩余部分。

    希望您使用的是 iOS 5 或更高版本,否则您需要为解析找到其他解决方案。

    【讨论】:

    • 虽然这是一个正确的答案,但我认为@phix23 更好,至少对于 AFNetworking lib 而言。 ;)
    【解决方案3】:
    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"]
    }
    

    【讨论】:

      猜你喜欢
      • 2014-03-06
      • 2012-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-30
      • 2021-09-20
      • 1970-01-01
      • 2012-06-08
      相关资源
      最近更新 更多