Erreur de gestion dans Alamofire
J'ai le code HTTP dans un AngularJS contrôleur:
$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 = "";
});
Dans le cas de réussite, le serveur répond avec une représentation JSON d'un utilisateur. Dans le cas d'erreur le serveur répond avec une simple chaîne de caractères comme User not found
qui peuvent être accessibles par le biais de la data
paramètre.
Je vais avoir de la difficulté à trouver comment faire quelque chose de semblable dans Alamofire. Voici ce que j'ai en ce moment:
@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"
});
}
}
}
Je n'ai aucune idée si je suis la manipulation de la non-erreur de cas correctement et apprécierait d'entrée.
source d'informationauteur Paymahn Moghadasian
Vous devez vous connecter pour publier un commentaire.
Vous êtes sur la bonne voie, mais vous allez courir dans certains problèmes avec votre application actuelle. Il y a quelques faible niveau Alamofire choses qui vont vous passionner que je veux vous aider avec. Voici une version alternative de votre exemple de code qui sera beaucoup plus efficace.
Validation
Tout d'abord, le
validate
fonction de la demande permettra de valider les suivantes:HTTPStatusCode
- A 200...299Content-Type
- Cet en-tête dans la réponse doit correspondre à laAccept
en-tête de la requête originaleVous pouvez trouver plus d'informations sur la validation dans Alamofire dans le LISEZMOI.
Weakify /Strongify
Assurez-vous de la faiblesse de l'autonomie et une forte autonomie de votre fermeture à assurez-vous de ne pas finir la création d'un cycle de conserver.
Envoi de File Principale
De votre centre de répartition des appels de la file d'attente principale ne sont pas nécessaires. Alamofire garantit que votre gestionnaire d'achèvement dans le
response
etresponseJSON
sérialiseurs est appelée sur la file d'attente principale déjà. Vous pouvez réellement fournir votre propre expédition de la file d'attente pour exécuter les sérialiseurs si vous le souhaitez, mais ni votre solution ou de la mine sont en train de faire afin de faire de l'envoi des appels de la file d'attente principale complètement inutile.Réponse Sérialiseur
Dans votre cas particulier, vous n'avez pas vraiment envie d'utiliser le
responseJSON
sérialiseur. Si vous le faites, vous ne finissent par obtenir des données en retour si vous ne passe pas la validation. La raison en est que la réponse de la sérialisation JSON est ce qui sera renvoyé dans laAnyObject
. Si la sérialisation échoue, leAnyObject
sera nul et vous ne serez pas en mesure de lire les données.Au lieu de cela, utilisez la
response
sérialiseur et essayer d'analyser les données à la main avecNSJSONSerialization
. Si cela échoue, alors vous pouvez compter sur la bonne oleNSString(data:encoding:)
méthode pour imprimer les données.J'espère que cela aide à faire la lumière sur certaines assez compliqué façons de trébucher.
Donc Alamofire traite toutes les demandes de succès. Cela vient vraiment de l'API serveur les en-têtes http retourné.
Vous pouvez utiliser Alamofire.Demande.valider()
Ça va te permettre de valider les en-têtes http, etc. Découvrez l'exemple
https://github.com/Alamofire/Alamofire#validation
Je suis en supposant que le message d'erreur sera dans le
data
objet.pour accéder aux valeurs à partir des données que vous pourriez faire quelque chose comme
Je ne suis pas vraiment sûr de votre api réponse ressemble, mais dans cet exemple