Ich möchte den HTTP-Antwortstatuscode (z. B. 400, 401, 403, 503 usw.) für Anforderungsfehler (und idealerweise auch für Erfolge) abrufen. In diesem Code führe ich eine Benutzerauthentifizierung mit HTTP Basic durch und möchte dem Benutzer mitteilen können, dass die Authentifizierung fehlgeschlagen ist, wenn der Benutzer sein Kennwort falsch eingibt.
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")
}
Leider scheint der erzeugte Fehler nicht darauf hinzudeuten, dass tatsächlich ein HTTP-Statuscode 409 empfangen wurde:
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
Außerdem wäre es schön, den HTTP-Body abzurufen, wenn ein Fehler auftritt, da meine Serverseite dort eine Textbeschreibung des Fehlers einfügt.
Fragen
Ist es möglich, den Statuscode bei einer Nicht-2xx-Antwort abzurufen?
Ist es möglich, den spezifischen Statuscode bei einer 2xx-Antwort abzurufen?
Ist es möglich, den HTTP-Body bei einer Nicht-2xx-Antwort abzurufen?
Vielen Dank!
Antworten:
Für Swift 3.x / Swift 4.0 / Swift 5.0- Benutzer mit Alamofire> = 4.0 / Alamofire> = 5.0
Ausführlicheres Beispiel:
(Alamofire 4 enthält ein völlig neues Fehlersystem, sucht hier für weitere Details)
Für Swift 2.x- Benutzer mit Alamofire> = 3.0
quelle
StatusCodeValidationFailed
,FAILURE: Error Domain=com.alamofire.error Code=-6003
. Es ist, wenn Sie tatsächlich HTTP-Antwortfehler erhalten möchten, ist es besser für Benutzerresponse.response?.statusCode
Im Vervollständigungshandler mit dem folgenden Argument
response
finde ich den http-Statuscode inresponse.response.statusCode
:quelle
quelle
Der beste Weg, um den Statuscode mit alamofire zu erhalten.
quelle
Nach
responseJSON
Abschluss können Sie den Statuscode vom Antwortobjekt abrufen, das Folgendes aufweistNSHTTPURLResponse?
:Dies funktioniert unabhängig davon, ob der Statuscode im Fehlerbereich liegt. Weitere Informationen finden Sie in der Dokumentation zu NSHTTPURLResponse .
Für Ihre andere Frage können Sie die
responseString
Funktion verwenden, um den rohen Antworttext abzurufen. Sie können dies zusätzlich hinzufügenresponseJSON
und beide werden aufgerufen.quelle
Ihr Fehler zeigt an, dass der Vorgang aus irgendeinem Grund abgebrochen wird. Ich brauche mehr Details, um zu verstehen, warum. Aber ich denke, das größere Problem könnte sein, dass
https://host.com/a/path
es keine echte Serverantwort gibt, die gemeldet werden muss, da Ihr Endpunkt gefälscht ist, und daher sehen Sienil
.Wenn Sie einen gültigen Endpunkt finden, der eine ordnungsgemäße Antwort liefert, sollten Sie einen Wert ungleich Null
res
(unter Verwendung der von Sam erwähnten Techniken) in Form einesNSURLHTTPResponse
Objekts mit Eigenschaften wiestatusCode
usw. sehen.Auch um klar zu sein,
error
ist von TypNSError
. Hier erfahren Sie, warum die Netzwerkanforderung fehlgeschlagen ist. Der Statuscode des Fehlers auf der Serverseite ist tatsächlich Teil der Antwort.Ich hoffe, das hilft bei der Beantwortung Ihrer Hauptfrage.
quelle
res
Objekt handeltnil
. Diese Antwort hilft also leider nicht weiter.error
beziehe mich auf Antworten mit Statuscodes, die außerhalb des von uns angegebenen Bereichs liegenvalidate()
. Vielen Dank!!!Oder verwenden Sie Pattern Matching
quelle
Sie können den folgenden Code für den Statuscode-Handler von alamofire überprüfen
Wenn der Statuscode nicht validiert ist, wird der Fehler im Schalterfall eingegeben
quelle
Für Swift 2.0-Benutzer mit Alamofire> 2.0
quelle
Ich musste wissen, wie ich die tatsächliche Fehlercode-Nummer erhalten konnte.
Ich habe ein Projekt von jemand anderem geerbt und musste die Fehlercodes aus einer
.catch
Klausel abrufen, die sie zuvor für Alamofire eingerichtet hatten:Oder wenn Sie es aus dem
response
Wert erhalten müssen, folgen Sie der Antwort von @ mbryzinskiquelle