Je voudrais récupérer le code d'état de la réponse HTTP (par exemple 400, 401, 403, 503, etc.) pour les échecs de demande (et idéalement pour les réussites aussi). Dans ce code, j'effectue une authentification utilisateur avec HTTP Basic et je souhaite pouvoir envoyer un message à l'utilisateur indiquant que l'authentification a échoué lorsque l'utilisateur a mal saisi son mot de passe.
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")
}
Malheureusement, l'erreur produite ne semble pas indiquer qu'un code d'état HTTP 409 a effectivement été reçu:
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
De plus, il serait bien de récupérer le corps HTTP lorsqu'une erreur se produit car mon serveur y mettra une description textuelle de l'erreur.
Questions
Est-il possible de récupérer le code d'état sur une réponse non-2xx?
Est-il possible de récupérer le code d'état spécifique sur une réponse 2xx?
Est-il possible de récupérer le corps HTTP sur une réponse non-2xx?
Merci!
Réponses:
Pour les utilisateurs de Swift 3.x / Swift 4.0 / Swift 5.0 avec Alamofire> = 4.0 / Alamofire> = 5.0
Exemple plus détaillé:
(Alamofire 4 contient un tout nouveau système d'erreur, regardez ici pour plus de détails)
Pour les utilisateurs de Swift 2.x avec Alamofire> = 3.0
la source
StatusCodeValidationFailed
,FAILURE: Error Domain=com.alamofire.error Code=-6003
. C'est si vous voulez réellement obtenir une erreur de réponse HTTP, il vaut mieux que l'utilisateurresponse.response?.statusCode
Dans le gestionnaire d'achèvement avec l'argument
response
ci-dessous, je trouve que le code d'état http est dansresponse.response.statusCode
:la source
la source
Meilleur moyen d'obtenir le code d'état en utilisant alamofire.
la source
Dans votre
responseJSON
complétion, vous pouvez obtenir le code d'état de l'objet de réponse, qui a un type deNSHTTPURLResponse?
:Cela fonctionnera indépendamment du fait que le code d'état soit dans la plage d'erreur. Pour plus d'informations, consultez la documentation NSHTTPURLResponse .
Pour votre autre question, vous pouvez utiliser la
responseString
fonction pour obtenir le corps de la réponse brute. Vous pouvez ajouter ceci en plus deresponseJSON
et les deux seront appelés.la source
Votre erreur indique que l'opération est annulée pour une raison quelconque. J'aurais besoin de plus de détails pour comprendre pourquoi. Mais je pense que le plus gros problème peut être que, puisque votre point de terminaison
https://host.com/a/path
est faux, il n'y a pas de véritable réponse du serveur à signaler, et par conséquent, vous voyeznil
.Si vous atteignez un point de terminaison valide qui fournit une réponse correcte, vous devriez voir une valeur non nulle pour
res
(en utilisant les techniques mentionnées par Sam) sous la forme d'unNSURLHTTPResponse
objet avec des propriétés telles questatusCode
, etc.Aussi, juste pour être clair,
error
est de typeNSError
. Il vous indique pourquoi la demande réseau a échoué. Le code d'état de l'échec côté serveur fait en fait partie de la réponse.J'espère que cela aidera à répondre à votre question principale.
la source
res
objet estnil
, donc cette réponse n'aide pas, désolé.error
référence à des réponses avec des codes de statut qui sont hors de la fourchette que nous prévoyonsvalidate()
. Merci!!!Ou utilisez la correspondance de motifs
la source
vous pouvez vérifier le code suivant pour le gestionnaire de code d'état par alamofire
si le code d'état n'est pas validé, il entrera l'échec en cas de commutation
la source
Pour les utilisateurs de Swift 2.0 avec Alamofire> 2.0
la source
J'avais besoin de savoir comment obtenir le numéro de code d'erreur réel.
J'ai hérité d'un projet de quelqu'un d'autre et j'ai dû récupérer les codes d'erreur d'une
.catch
clause qu'ils avaient précédemment configurée pour Alamofire:Ou si vous avez besoin de l'obtenir à partir de la
response
valeur, suivez la réponse de @ mbryzinskila source