Fehlerbehandlung in Alamofire
Habe ich den HTTP code in einem AngularJS controller:
$http.post('/api/users/authenticate', {email: $scope.email, password: $scope.password})
.success(function (data, status, headers, config) {
authService.login($scope.email);
$state.go('home');
})
.error(function (data, status, headers, config) {
$scope.errorMessages = data;
$scope.password = "";
});
In dem Fall Erfolg, der server antwortet mit einer JSON-Repräsentation eines Benutzers. Im Fehler-Fall wird der server antwortet mit einem einfachen string wie User not found
zugegriffen werden kann durch die data
parameter.
Ich habe Schwierigkeiten, herauszufinden, wie etwas zu tun, ähnlich wie in Alamofire. Hier ist, was ich jetzt haben:
@IBAction func LoginPressed(sender: AnyObject) {
let params: Dictionary<String,AnyObject> = ["email": emailField.text, "password": passwordField.text]
Alamofire.request(.POST, "http://localhost:3000/api/users/authenticate", parameters: params)
.responseJSON {(request, response, data, error) in
if error == nil {
dispatch_async(dispatch_get_main_queue(), {
let welcome = self.storyboard?.instantiateViewControllerWithIdentifier("login") as UINavigationController;
self.presentViewController(welcome, animated: true, completion: nil);
})
}
else{
dispatch_async(dispatch_get_main_queue(), {
//I want to set the error label to the simple message which I know the server will return
self.errorLabel.text = "something went wrong"
});
}
}
}
Ich habe keine Ahnung, ob ich Umgang mit der nicht-Fehler-Fall richtig und würde schätzen, Eingang.
InformationsquelleAutor Paymahn Moghadasian | 2015-03-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie auf dem richtigen Weg sind, aber Sie sind dabei auf einige entscheidende Fragen, die mit Ihrer aktuellen Umsetzung. Es gibt einige low-level-Alamofire Dinge, die gehen, um Reise, die Sie bis, die ich will, um Ihnen zu helfen mit. Hier ist eine alternative version Ihres code-Beispiel, das wird viel effektiver.
Validierung
First off, die
validate
Funktion auf die Anfrage wird validiert die folgenden:HTTPStatusCode
- 200...299Content-Type
- Diese header in der Antwort muss mit derAccept
- header in der ursprünglichen AnfrageFinden Sie weitere Informationen für die Validierung in Alamofire in der README.
Weakify /Strongify
Stellen Sie sicher, zu schwach selbst, und stark selbst Ihre Schließung, um sicherzustellen, dass Sie nicht am Ende die Schaffung eines retain-Zyklus.
Versand an Haupt-Warteschlange
Ihre dispatch-Anrufe zurück in die main queue nicht notwendig sind. Alamofire garantiert, dass Ihre Abschluss-handler in der
response
undresponseJSON
serialisierungsprogramme am main queue schon. Sie können tatsächlich Ihren eigenen dispatch-queue zur Ausführung der serialisierungsprogramme auf, wenn Sie möchten, aber weder deine Lösung, oder meine sind derzeit so macht der Versand Aufrufe der main-queue-völlig unnötig.Response Serializer
In Ihrem Fall, Sie nicht wirklich wollen, verwenden Sie die
responseJSON
serializer. Wenn Sie tun, werden Sie nicht am Ende immer alle Daten zurück, wenn Sie don ' T-pass-Validierung. Der Grund dafür ist, dass die Antwort der JSON-Serialisierung ist das, was zurückgegeben werden, wie dasAnyObject
. Wenn die Serialisierung fehl, kann derAnyObject
wird nil, und Sie werden nicht in der Lage, um die Daten Auslesen.Verwenden Sie stattdessen die
response
serializer und versuchen, analysieren die Daten manuell mitNSJSONSerialization
. Wenn das fehlschlägt, dann können Sie sich auf das good oleNSString(data:encoding:)
Methode zum drucken der Daten.Hoffentlich hilft etwas Licht auf einige ziemlich komplizierter Art und Weise zu Schaden kommen.
Gute Frage, unmöglich eine schlüssige Antwort zu. Es hängt von dem Verhalten, das Sie möchten. Wenn Sie möchten, dass der Besitzer des
loginPressed
Methode im Speicher gehalten werden, unabhängig davon, ob sonst nichts ist, mit einem Verweis auf es, dann würden Sie nicht verwenden möchten[weak self]
. Sie haben jedoch immer die potentielle Gefahr der Schaffung einer retain-Zyklus, wenn Sie nicht die weakify/strongify Muster. Mehr info hier und here.Gute Erklärung. In Swift 3 ersetzen können
if let strongSelf = self { ... }
mit nurguard let strongSelf = self else { return }
guard
wurde eingeführt, Swift 2.InformationsquelleAutor cnoon
So Alamofire behandelt alle Anfragen erfolgreich. Das kommt wirklich auf den API-server http-Headern zurückgegeben.
Könnten Sie Alamofire.Anfrage.validate()
Es wird Ihnen erlauben, zu überprüfen, http-Header, etc. Check-out die Beispiel
https://github.com/Alamofire/Alamofire#validation
Gehe ich davon aus das die Fehlermeldung wird in der
data
Objekt.Zugriff auf die Werte von Daten, die Sie etwas tun können, wie
Ich bin nicht wirklich sicher über Ihre api-Antwort aussieht, aber in diesem Beispiel
error
wird nicht null sein. Wenn das der Fall ist,data
ist einAnyObject
und ich bin mir nicht sicher, wie Sie auf die tatsächlicheUser not found
Inhalt.InformationsquelleAutor slik