Alamofire:网络错误与无效状态代码?

时间:2016-12-03 15:30:47

标签: swift alamofire

使用Alamofire 4 / Swift 3如何区分由于以下原因而失败的请求:

  1. 网络连接(主机关闭,无法访问主机)vs
  2. 无效的服务器HTTP响应代码(即:499)导致Alamofire请求因调用validate()而失败?
  3. 代码:

        sessionManager.request(url, method: .post, parameters:dict, encoding: JSONEncoding.default)
            .validate() //Validate status code
            .responseData { response in
    
            if response.result.isFailure {
                   //??NETWORK ERROR OR INVALID SERVER RESPONSE??
            }
        }
    

    我们希望以不同的方式处理每个案例。在后一种情况下,我们想要询问答复。 (在前者我们没有,因为没有回应)。

3 个答案:

答案 0 :(得分:3)

这是我们目前的工作解决方案:

sessionManager.request(url, method: .post, parameters:dict, encoding: JSONEncoding.default)
    .validate() //Validate status code
    .responseData { response in

    if response.result.isFailure {
        if let error = response.result.error as? AFError, error.responseCode == 499 {
            //INVALID SESSION RESPONSE
        } else {
            //NETWORK FAILURE
        }
    }
}

如果result.error类型AFError,您可以使用responseCode。来自AFError来源评论:

/// Returns whether the `AFError` is a response validation error. When `true`, the `acceptableContentTypes`,
/// `responseContentType`, and `responseCode` properties will contain the associated values.
public var isResponseValidationError: Bool {
    if case .responseValidationFailed = self { return true }
    return false
}

也许有更好的方式(?)但这似乎有用......

答案 1 :(得分:1)

自动验证应考虑 200 ... 299 (成功代码)范围内的状态代码,以便在获得无效服务器HTTP响应代码5xx时(499表示{{ 3}})你确定它不依赖于验证。

关于statusCode,我的建议是遵循正确的新规则来获取它。如果你有一些问题要检索它,请看这个SO Client Closed Request

谈到网络可达性,你可以写:

let manager = NetworkReachabilityManager(host: "www.apple.com")
manager?.listener = { status in
    print("Network Status Changed: \(status)")
}
manager?.startListening()

使用网络可访问性确定下一步该做什么时,需要记住一些重要事项。

  • 请勿使用Reachability来确定网络请求是否应该 发送。你应该总是发送它。
  • 恢复可达性后,使用该事件重试失败的网络 要求。即使网络请求可能仍然失败,这是一个 重试它们的好时机。
  • 网络可达性状态可用于确定a的原因 网络请求可能已失败。如果网络请求失败,那就是 告诉用户网络请求由于失败而更有用 离线而不是更技术性的错误,例如“请求 超时。“

您也可以在官方Alamofire 4 GitHUB中找到这些详细信息answer

答案 2 :(得分:1)

Alamofire可以告诉您有关请求的状态, 这段代码对我来说很合适:

if let error = response.result.error as? NSError {
    print(error)//print the error description
    if (error.code == -1009){
                    print(error.code) // this will print -1009,somehow it means , there is no internet connection
                    self.errorCode = error.code

    }
      //check for other error.code    

}else{
  //there is no problem
}

error.code会告诉你问题是什么