在HTTP错误期间获取响应正文的任何方法吗?

57

我正在调用一个API,偶尔会抛出HTTP 403错误,响应体可以以json的形式提供一些额外的信息,但是我无论如何都似乎无法从Alamofire响应对象中获取这些信息。如果通过chrome访问API,开发者工具中可以看到这些信息。以下是我的代码:

Alamofire.request(mutableURLRequest).validate().responseJSON() {
    (response) in
    switch response.result {
        case .Success(let data):
            if let jsonResult = data as? NSDictionary {
                completion(jsonResult, error: nil)
            } else if let jsonArray = data as? NSArray {
                let jsonResult = ["array" : jsonArray]
                completion(jsonResult, error: nil)
            }
        case .Failure(let error):
            //error tells me 403
            //response.result.data can't be cast to NSDictionary or NSArray like
            //the successful cases, how do I get the response body?
    }

我已查询了响应附加的几乎所有对象,但在HTTP错误的情况下似乎没有返回响应主体。这里是否有解决方法或我遗漏的内容?
2个回答

112

我在他们的 Github 页面上问了这个问题,并得到了 cnoon 的回答:

Swift 2:

if let data = response.data {
    let json = String(data: data, encoding: NSUTF8StringEncoding)
    print("Failure Response: \(json)")
}

Swift 3:

if let data = response.data {
    let json = String(data: data, encoding: String.Encoding.utf8)
    print("Failure Response: \(json)")
}

我只是省略了编码部分,这样做可以在出现错误的情况下仍能获取响应json。

https://github.com/Alamofire/Alamofire/issues/1059


2
现在(XC8.1,Swift 3)的编码方式是:String(data: data, encoding: String.Encoding.utf8) - Dilapidus
5
如果您使用的是SwiftyJSON,则可以执行以下操作:JSON(response.data!) - Isaac Bosca
1
Swift 5:相同的格式仍然适用,但您也可以使用更短的编码形式,即String(data: data, encoding: .utf8)。 - Rocket Garden

8

Swift 5 在 DefaultDataResponse 扩展中提供了更容易获取响应主体的功能 :

String(data: data!, encoding: String.Encoding.utf8)

如何从完整响应中获取特定值的数据? - IAmNoob
这会打印出整个响应主体,你需要查看原始数据。 - Medhi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接