Je crée une application avec une API basée sur REST et j'en suis arrivé au point où je spécifie des codes d'état pour chaque demande.
Quel code d'état dois-je envoyer pour les demandes qui n'ont pas été validées ou où une demande essaie d'ajouter un doublon dans ma base de données?
J'ai parcouru http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html mais aucun ne semble correct.
Existe-t-il une pratique courante lors de l'envoi de codes d'état?
http
rest
http-status-codes
alexn
la source
la source
Réponses:
En cas d'échec de validation d'entrée: 400 Bad Request + votre description facultative. Ceci est suggéré dans le livre " RESTful Web Services ". Pour double soumission: 409 Conflict
Mise à jour juin 2014
La spécification pertinente était RFC2616 , qui donnait l'utilisation de 400 (Bad Request) de manière assez étroite comme
On aurait donc pu dire que c'était inapproprié pour les erreurs sémantiques. Mais plus maintenant; depuis juin 2014, la norme pertinente RFC 7231 , qui remplace la précédente RFC2616, donne l'utilisation de 400 (Bad Request) plus largement que
la source
something perceived to be a client error
, tous les exemples donnés dans ce paragraphe sont des violations du protocole HTTP, pas des erreurs logiques: syntaxe, cadrage, routage. Ainsi, je considère que la spécification HTTP ne permet pas 400 pour la validation a échoué au niveau de l'application.Vous devriez certainement donner une explication plus détaillée dans les en-têtes et / ou le corps de la réponse (par exemple avec un en-tête personnalisé -
X-Status-Reason: Validation failed
).la source
HTTP/1.0 403 Form validation errors
est la façon la plus simple de procéder.Je recommande le code d'état 422, "Entité non traitable" .
la source
200 300, 400, 500 sont tous très génériques. Si vous voulez générique, 400 est OK.
422 est utilisé par un nombre croissant d'API, et est même utilisé par Rails prêt à l'emploi.
Quel que soit le code d'état que vous choisissez pour votre API, quelqu'un sera en désaccord. Mais je préfère 422 parce que je pense que '400 + statut du texte' est trop générique. De plus, vous ne profitez pas d'un analyseur prêt pour JSON; en revanche, un 422 avec une réponse JSON est très explicite, et beaucoup d'informations d'erreur peuvent être transmises.
En parlant de réponse JSON, j'ai tendance à standardiser la réponse d'erreur Rails pour ce cas, qui est:
Ce format est parfait pour la validation de formulaire, que je considère comme le cas le plus complexe à prendre en charge en termes de «richesse de rapport d'erreurs». Si votre structure d'erreurs est la suivante, elle gérera probablement tous vos besoins de rapport d'erreurs.
la source
arg1
est valide etarg2
est valide, mais la combinaison des deux, avec les valeurs spécifiques envoyées, n'est pas valide.200
Ugh ... (309, 400, 403, 409, 415, 422) ... beaucoup de réponses essayant de deviner, argumenter et standardiser quel est le meilleur code retour pour une requête HTTP réussie mais un appel REST ayant échoué .
C'est mal de mélanger les codes d'état HTTP et les codes d'état REST.
Cependant, j'ai vu de nombreuses implémentations les mélanger, et de nombreux développeurs peuvent ne pas être d'accord avec moi.
Les codes de retour HTTP sont liés à
HTTP Request
lui - même. Un appel REST est effectué à l'aide d'une demande de protocole de transfert hypertexte et il fonctionne à un niveau inférieur à la méthode REST invoquée elle-même. REST est un concept / approche, et sa sortie est un résultat métier / logique , tandis que le code de résultat HTTP est un transport .Par exemple, retourner "404 Not found" lorsque vous appelez / users / est confus, car cela peut signifier:
"403 Interdit / Accès refusé" peut signifier:
Et la liste peut continuer avec '500 Server error "(une erreur HTTP Apache / Nginx lancée ou une erreur de contrainte métier dans REST) ou d'autres erreurs HTTP, etc.
À partir du code, il est difficile de comprendre quelle était la raison de l'échec, un échec HTTP (transport) ou un échec REST (logique).
Si la requête HTTP a été exécutée physiquement avec succès, elle doit toujours renvoyer 200 codes, quel que soit le ou les enregistrements trouvés ou non. Parce que la ressource URI est trouvée et a été gérée par le serveur HTTP. Oui, il peut renvoyer un ensemble vide. Est-il possible de recevoir une page Web vide avec 200 comme résultat HTTP, non?
Au lieu de cela, vous pouvez retourner 200 codes HTTP avec quelques options:
De plus, certains fournisseurs d'accès Internet peuvent intercepter vos demandes et vous renvoyer un code HTTP 404. Cela ne signifie pas que vos données ne sont pas trouvées, mais c'est quelque chose de mal au niveau du transport.
De Wiki :
Pourquoi ne pas simplement répondre avec quelque chose comme ça?
Google renvoie toujours 200 comme code d'état dans son API de géocodage, même si la demande échoue logiquement: https://developers.google.com/maps/documentation/geocoding/intro#StatusCodes
Facebook renvoie toujours 200 pour les demandes HTTP réussies, même si la demande REST échoue: https://developers.facebook.com/docs/graph-api/using-graph-api/error-handling
C'est simple, les codes d'état HTTP sont pour les requêtes HTTP. L'API REST vous appartient, définissez vos codes d'état.
la source
BadRequest()
méthode .NET a son propre modèle de retour qui sera différent de votre modèle de retour normal. C'est un cauchemar à analyser. @KevinHooke, renvoyer HTTP 200 pour une erreur de validation REST revient à dire: "J'ai reçu votre message, la réponse est non, et voici pourquoi." Le retour de HTTP 400 dit: "Je ne sais pas de quoi vous parlez."Un doublon dans la base de données devrait être a
409 CONFLICT
.Je recommande d'utiliser
422 UNPROCESSABLE ENTITY
pour les erreurs de validation.Je donne une explication plus longue des codes 4xx ici .
la source
Le code de statut 304 non modifié donnerait également une réponse acceptable à une demande en double. Cela revient à traiter un en-tête à l'
If-None-Match
aide d'une balise d'entité.À mon avis, la réponse de @ Piskvor est le choix le plus évident de ce que je perçois comme l'intention de la question d'origine, mais j'ai une alternative qui est également pertinente.
Si vous souhaitez traiter une demande en double comme un avertissement ou une notification plutôt que comme une erreur, un code d'état de réponse
304
Non modifié etContent-Location
tête identifiant la ressource existante seraient tout aussi valides. Lorsque l'intention est simplement de garantir l'existence d'une ressource, une demande en double ne serait pas une erreur mais une confirmation. La demande n'est pas fausse, mais est simplement redondante et le client peut se référer à la ressource existante.En d'autres termes, la demande est bonne, mais comme la ressource existe déjà, le serveur n'a pas besoin d'effectuer de traitement supplémentaire.
la source
L'adaptateur ActiveRecord d'Ember-Data s'attend
422 UNPROCESSABLE ENTITY
à être renvoyé du serveur. Donc, si votre client est écrit dans Ember.js, vous devez utiliser 422. Seulement alors, DS.Errors sera rempli avec des erreurs renvoyées. Vous pouvez bien sûr remplacer 422 par n'importe quel autre code dans votre adaptateur.la source
406 - Inacceptable
Ce qui signifie que cette réponse est envoyée lorsque le serveur Web, après avoir effectué une négociation de contenu pilotée par le serveur, ne trouve aucun contenu conforme aux critères donnés par l'agent utilisateur.
la source