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