Я хотел бы получить код состояния ответа HTTP (например, 400, 401, 403, 503 и т. Д.) Для сбоев запроса (а в идеале и для успехов). В этом коде я выполняю аутентификацию пользователя с помощью HTTP Basic и хочу иметь возможность сообщить пользователю, что аутентификация не удалась, когда пользователь неправильно набирает свой пароль.
Alamofire.request(.GET, "https://host.com/a/path").authenticate(user: "user", password: "typo")
.responseString { (req, res, data, error) in
if error != nil {
println("STRING Error:: error:\(error)")
println(" req:\(req)")
println(" res:\(res)")
println(" data:\(data)")
return
}
println("SUCCESS for String")
}
.responseJSON { (req, res, data, error) in
if error != nil {
println("JSON Error:: error:\(error)")
println(" req:\(req)")
println(" res:\(res)")
println(" data:\(data)")
return
}
println("SUCCESS for JSON")
}
К сожалению, возникшая ошибка не указывает на то, что код состояния HTTP 409 действительно был получен:
STRING Error:: error:Optional(Error Domain=NSURLErrorDomain Code=-999 "cancelled" UserInfo=0x7f9beb8efce0 {NSErrorFailingURLKey=https://host.com/a/path, NSLocalizedDescription=cancelled, NSErrorFailingURLStringKey=https://host.com/a/path})
req:<NSMutableURLRequest: 0x7f9beb89d5e0> { URL: https://host.com/a/path }
res:nil
data:Optional("")
JSON Error:: error:Optional(Error Domain=NSURLErrorDomain Code=-999 "cancelled" UserInfo=0x7f9beb8efce0 {NSErrorFailingURLKey=https://host.com/a/path, NSLocalizedDescription=cancelled, NSErrorFailingURLStringKey=https://host.com/a/path})
req:<NSMutableURLRequest: 0x7f9beb89d5e0> { URL: https://host.com/a/path }
res:nil
data:nil
Кроме того, было бы неплохо получить тело HTTP при возникновении ошибки, потому что моя серверная сторона помещает туда текстовое описание ошибки.
Вопросы
Можно ли получить код состояния при ответе, отличном от 2xx?
Можно ли получить конкретный код состояния при ответе 2xx?
Можно ли получить тело HTTP при ответе, отличном от 2xx?
Спасибо!
Ответы:
Для пользователей Swift 3.x / Swift 4.0 / Swift 5.0 с Alamofire> = 4.0 / Alamofire> = 5.0
Более подробный пример:
(Alamofire 4 содержит совершенно новую систему ошибок, подробности смотрите здесь )
Для пользователей Swift 2.x с Alamofire> = 3.0
источник
StatusCodeValidationFailed
,FAILURE: Error Domain=com.alamofire.error Code=-6003
. Если вы действительно хотите получить ошибку HTTP-ответа, лучше для пользователяresponse.response?.statusCode
В обработчике завершения с аргументом
response
ниже я обнаружил, что код состояния http находится вresponse.response.statusCode
:источник
источник
Лучший способ получить код состояния с помощью alamofire.
источник
По
responseJSON
завершении вы можете получить код состояния из объекта ответа, который имеет типNSHTTPURLResponse?
:Это будет работать независимо от того, находится ли код состояния в диапазоне ошибок. Дополнительные сведения см. В документации NSHTTPURLResponse .
Что касается вашего другого вопроса, вы можете использовать
responseString
функцию для получения необработанного тела ответа. Вы можете добавить это в дополнение к,responseJSON
и оба будут вызываться.источник
Ваша ошибка указывает на то, что операция по какой-то причине отменяется. Мне нужно больше подробностей, чтобы понять почему. Но я думаю, что более серьезная проблема может заключаться в том, что, поскольку ваша конечная точка
https://host.com/a/path
является поддельной, нет реального ответа сервера на отчет, и, следовательно, вы видитеnil
.Если вы обнаружите допустимую конечную точку, которая обеспечивает правильный ответ, вы должны увидеть ненулевое значение для
res
(с использованием методов, упомянутых Сэмом) в формеNSURLHTTPResponse
объекта со свойствами, такими какstatusCode
и т. Д.Кроме того, для ясности,
error
относится к типуNSError
. Он сообщает вам, почему сетевой запрос не удался. Код состояния сбоя на стороне сервера фактически является частью ответа.Надеюсь, это поможет ответить на ваш главный вопрос.
источник
res
объект естьnil
, поэтому этот ответ не помогает, извините.error
имел в виду ответы с кодами состояния , которые находятся вне диапазона , мы предоставляем дляvalidate()
. Спасибо!!!Или используйте сопоставление с образцом
источник
вы можете проверить следующий код для обработчика кода состояния от alamofire
если код состояния не подтвержден, в случае переключения будет введена ошибка
источник
Для пользователей Swift 2.0 с Alamofire> 2.0
источник
Мне нужно было знать, как получить фактический номер кода ошибки.
Я унаследовал проект от кого-то другого, и мне пришлось получить коды ошибок из
.catch
пункта, который они ранее настроили для Alamofire:Или, если вам нужно получить его из
response
значения, следуйте ответу @mbryzinskiисточник