Alamofire: ошибка сети vs недопустимый код состояния?

использование Alamofire 4 / Swift 3 Как вы можете различать запрос, который не выполняется из-за:

  1. сетевое подключение (хост вниз, не может добраться до хоста) vs
  2. недопустимый код ответа 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
}

ошибка.код скажет вам, в чем проблема