Chciałbym pobrać kod stanu odpowiedzi HTTP (np. 400, 401, 403, 503 itd.) W przypadku niepowodzeń żądań (a najlepiej również w przypadku sukcesów). W tym kodzie przeprowadzam autoryzację użytkownika za pomocą HTTP Basic i chcę mieć możliwość przesłania użytkownikowi wiadomości, że uwierzytelnianie nie powiodło się, gdy użytkownik błędnie wpisuje hasło.
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")
}
Niestety, wygenerowany błąd nie wydaje się wskazywać, że faktycznie odebrano kod stanu 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
Ponadto byłoby miło pobrać treść HTTP, gdy wystąpi błąd, ponieważ mój serwer umieści tam tekstowy opis błędu.
Pytania
Czy można pobrać kod statusu w odpowiedzi innej niż 2xx?
Czy można odzyskać określony kod statusu po odpowiedzi 2xx?
Czy można pobrać treść HTTP na podstawie odpowiedzi innej niż 2xx?
Dzięki!
Odpowiedzi:
Dla użytkowników Swift 3.x / Swift 4.0 / Swift 5.0 z Alamofire> = 4.0 / Alamofire> = 5.0
Bardziej szczegółowy przykład:
(Alamofire 4 zawiera zupełnie nowy system błędów, spójrz tutaj po szczegóły)
Dla użytkowników Swift 2.x z Alamofire> = 3.0
źródło
StatusCodeValidationFailed
,FAILURE: Error Domain=com.alamofire.error Code=-6003
. Jeśli faktycznie chcesz uzyskać błąd odpowiedzi HTTP, lepiej dla użytkownikaresponse.response?.statusCode
W module obsługi zakończenia z argumentem
response
poniżej znajduję kod statusu httpresponse.response.statusCode
:źródło
źródło
Najlepszy sposób na uzyskanie kodu statusu za pomocą alamofire.
źródło
W swoim
responseJSON
zakończeniu możesz pobrać kod statusu z obiektu odpowiedzi, który ma typNSHTTPURLResponse?
:Będzie to działać niezależnie od tego, czy kod stanu mieści się w zakresie błędu. Aby uzyskać więcej informacji, zapoznaj się z dokumentacją NSHTTPURLResponse .
W przypadku drugiego pytania możesz użyć
responseString
funkcji, aby uzyskać nieprzetworzoną treść odpowiedzi. Możesz dodać to dodatkowo doresponseJSON
i oba zostaną wywołane.źródło
Twój błąd wskazuje, że operacja jest z jakiegoś powodu anulowana. Potrzebuję więcej szczegółów, żeby zrozumieć, dlaczego. Ale myślę, że większym problemem może być to, że ponieważ twój punkt końcowy
https://host.com/a/path
jest fałszywy, nie ma prawdziwej odpowiedzi serwera na raport, a więc widzisznil
.Jeśli trafisz na prawidłowy punkt końcowy, który podaje właściwą odpowiedź, powinieneś zobaczyć niezerową wartość dla
res
(używając technik, o których wspomina Sam) w postaciNSURLHTTPResponse
obiektu o właściwościach takich jakstatusCode
itp.Poza tym, żeby było jasne,
error
jest typowyNSError
. Informuje, dlaczego żądanie sieciowe nie powiodło się. Kod stanu błędu po stronie serwera jest w rzeczywistości częścią odpowiedzi.Mam nadzieję, że pomoże to odpowiedzieć na twoje główne pytanie.
źródło
res
obiekt jestnil
, więc ta odpowiedź nie pomaga, przepraszam.error
odnosi się do odpowiedzi z kodami stanu, które są poza zakresem, który przewidujemyvalidate()
. Dzięki!!!Lub użyj dopasowania do wzorca
źródło
możesz sprawdzić następujący kod programu obsługi kodu statusu przez alamofire
jeśli kod statusu nie zostanie zatwierdzony, zostanie wprowadzony błąd w przypadku przełącznika
źródło
Dla użytkowników Swift 2.0 z Alamofire> 2.0
źródło
Musiałem wiedzieć, jak uzyskać rzeczywisty numer kodu błędu.
Odziedziczyłem projekt po kimś innym i musiałem uzyskać kody błędów z
.catch
klauzuli, którą wcześniej skonfigurowali dla Alamofire:Lub jeśli chcesz uzyskać to z
response
wartości, postępuj zgodnie z odpowiedzią @ mbryzinskiźródło