Alamofire: ошибка сети vs недопустимый код состояния?
использование Alamofire 4 / Swift 3 Как вы можете различать запрос, который не выполняется из-за:
- сетевое подключение (хост вниз, не может добраться до хоста) vs
- недопустимый код ответа HTTP сервера (ie: 499), который вызывает сбой запроса Alamofire из-за вызова
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??
}
}
мы хотим обрабатывать каждый случай по-разному. В последнем случае мы хотим допросить ответ. (В первом случае мы не ответа нет).
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
}
может быть, есть лучший способ (?) но это, кажется, работает...
автоматическая проверка следует рассмотреть код состояния в 200...299 (коды успеха) диапазон, поэтому, когда вы получаете недопустимый код ответа HTTP сервера 5xx (499 означает Клиент Закрыт Запрос) вы уверены, что это не зависит от проверки.
о statusCode
, мой совет-следовать правильным новым правилам, чтобы получить его. Если у вас есть какие-то проблемы, чтобы получить его, посмотрите это так ответ.
говоря о сети достижимость вы могли бы написать:
let manager = NetworkReachabilityManager(host: "www.apple.com")
manager?.listener = { status in
print("Network Status Changed: \(status)")
}
manager?.startListening()
есть некоторые важные вещи, чтобы помнить при использовании сети достижимости, чтобы определить, что делать дальше.
- не используйте достижимость, чтобы определить, должен ли сетевой запрос быть отправленный. Вы всегда должны посылать его.
- при восстановлении достижимости используйте событие для повторной попытки сбоя сети запросы. Хотя сетевые запросы может все рухнуть, это хороший момент, чтобы повторить их.
- в состояние достижимости сети может быть полезно для определения того, почему a возможно, сбой сетевого запроса. Если сетевой запрос завершается неудачно, это более полезно сообщить пользователю, что сетевой запрос не удался из-за быть автономным, а не более технической ошибкой, такой как " запрос истекло время."
вы можете найти эти данные также в официальном Alamofire 4 GitHUB страница
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
}
ошибка.код скажет вам, в чем проблема