使用Alamofire 4 / Swift 3如何区分由于以下原因而失败的请求:
validate()
而失败? 代码:
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??
}
}
我们希望以不同的方式处理每个案例。在后一种情况下,我们想要询问答复。 (在前者我们没有,因为没有回应)。
答案 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()
使用网络可访问性确定下一步该做什么时,需要记住一些重要事项。
您也可以在官方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会告诉你问题是什么