如何在AFJSONRequestOperation的回调中从NSHTTPURLResponse中获取响应数据?

Posted

技术标签:

【中文标题】如何在AFJSONRequestOperation的回调中从NSHTTPURLResponse中获取响应数据?【英文标题】:How to get the response data out of the NSHTTPURLResponse in the callback of AFJSONRequestOperation? 【发布时间】:2012-05-16 22:46:56 【问题描述】:

我有一种情况,我需要从仅包含 NSHTTPURLResponse 的回调块中访问 AFJSONRequestOperation 的原始响应数据。我能够从 NSHTTPURLResponse 中获取 statusCode,但看不到任何获取原始数据的方法。有没有人知道的好方法可以从此操作的失败回调块中访问它?

【问题讨论】:

【参考方案1】:

NSHTTPURLResponse只包含HTTP头信息;没有身体数据。所以不,这是不可能的。如果您对此代码有任何控制权,请让块或方法传递操作本身并获取responseDataresponseJSON

【讨论】:

Matt,我就是这么想的,最后我确实提到了获取 responseData 的操作,但那样确实感觉很笨拙。除了返回 responseData 以及 NSHTTPURLResponse 的当前方法之外,您是否考虑过添加另一种方法? 你说的是什么方法?所有具有回调的 AFN 方法都会返回您可能需要了解的有关操作状态的所有信息——即操作对象本身,以及其他一些显着部分。 我特指JSONRequestOperationWithRequest:success:failure:这个方法 在失败块中我可以参考 NSURLResponse 'response',但正如你之前提到的,它只包含 HTTP 标头信息,没有正文数据。但在某些情况下,即使是失败,我也需要(而且我认为其他人会需要)查看返回的实际 responseData。我知道除了通过“操作”对象之外没有其他方法可以实现它。所以,我想知道的是,您是否考虑过在 responseData 的返回块中添加一个参数......也许这对于这个来说太极端了。 新的 AFHTTPSessionManager 怎么样?你没有在那里得到操作对象【参考方案2】:

在来自responseJSON 的回调中,您可以使用response.result.valueString(data:response.data!, encoding: .utf8)DataResponse<Any> 对象获取正文。

您无法从response.response 获取它,这是一个NSHTTPURLResponse 对象。这只有标题信息。

Alamofire.request(URL(string: "https://foo.com")!).validate(statusCode: 200..<300).responseJSON()  response in
    let body = response.result.value

如果 http 响应未验证上述内容无效。但这确实:

Alamofire.request(URL(string: "https://foo.com")!).validate(statusCode: 200..<300).responseJSON()  response in
    let body = String(data:response.data!, encoding: .utf8)

【讨论】:

【参考方案3】:

老问题,但无论如何......

您不需要获取操作对象,您可以轻松地执行以下操作:

NSData * data = [NSJSONSerialization dataWithJSONObject:JSON options:0 error:nil]];

回调接收到的 JSON id。

【讨论】:

JSON 对象在失败回调块中可能为 nil,因为它可能由于不正确的 json 而失败。

以上是关于如何在AFJSONRequestOperation的回调中从NSHTTPURLResponse中获取响应数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AFJSONRequestOperation 获取 HTTP 响应

如何使用 AFNetworking AFJSONRequestOperation 确定失败的原因

在 AFJSONRequestOperation 中接受无效的 JSON?

AFJSONRequestOperation 不更新块外的内容

AFJSONRequestOperation 响应延迟

使用 AFJSONRequestOperation 返回 JSON