J'essaie de déterminer le code d'état correct à retourner dans différents scénarios avec une API "REST-like" sur laquelle je travaille. Disons que j'ai un point final qui permet de poster des achats au format JSON. Cela ressemble à ceci:
{
"account_number": 45645511,
"upc": "00490000486",
"price": 1.00,
"tax": 0.08
}
Que dois-je retourner si le client m'envoie "sales_tax" (au lieu de la "taxe" attendue). Actuellement, je retourne un 400. Mais, j'ai commencé à me poser des questions à ce sujet. Dois-je vraiment retourner un 422? Je veux dire, c'est JSON (qui est pris en charge) et c'est JSON valide, il ne contient tout simplement pas tous les champs obligatoires.
rest
http-status-codes
David S
la source
la source
Réponses:
400 Bad Request semble maintenant être le meilleur code d'état HTTP / 1.1 pour votre cas d'utilisation.
Au moment de votre question (et de ma réponse d'origine), la RFC 7231 n'était pas une chose; auquel point je me suis opposé
400 Bad Request
parce que la RFC 2616 a dit (avec emphase la mienne):et la demande que vous décrivez est un JSON syntaxiquement valide enfermé dans un HTTP syntaxiquement valide, et donc le serveur n'a aucun problème avec la syntaxe de la demande.
Cependant, comme l'a souligné Lee Saferite dans les commentaires , la RFC 7231, qui rend obsolète la RFC 2616, n'inclut pas cette restriction :
Cependant, avant cette reformulation (ou si vous voulez ergoter sur le fait que la RFC 7231 n'est actuellement qu'une norme proposée ),
422 Unprocessable Entity
ne semble pas un code d'état HTTP incorrect pour votre cas d'utilisation, car comme le dit l'introduction de la RFC 4918:Et la description de
422
dit:(Notez la référence à la syntaxe; je soupçonne que 7231 obsolète en partie 4918 aussi)
Cela ressemble exactement à votre situation, mais juste au cas où il y aurait un doute, il continue:
(Remplacez "XML" par "JSON" et je pense que nous pouvons convenir que c'est votre situation)
Maintenant, certains objecteront que la RFC 4918 concerne les «extensions HTTP pour la création et la version distribuées sur le Web (WebDAV)» et que vous (vraisemblablement) ne faites rien impliquant WebDAV, vous ne devriez donc pas en utiliser les éléments.
Étant donné le choix entre l'utilisation d'un code d'erreur dans la norme d'origine qui ne couvre pas explicitement la situation, et celui d'une extension qui décrit exactement la situation, je choisirais cette dernière.
En outre, la section 21.4 de la RFC 4918 fait référence au registre de code d'état HTTP (Hypertext Transfer Protocol) de l' IANA , où se trouve 422.
Je propose qu'il soit tout à fait raisonnable pour un client ou un serveur HTTP d'utiliser n'importe quel code d'état de ce registre, tant qu'ils le font correctement.
Mais à partir de HTTP / 1.1, le RFC 7231 a une traction, alors utilisez-le
400 Bad Request
!la source
400 Bad Request est le code d'état HTTP approprié pour votre cas d'utilisation. Le code est défini par HTTP / 0.9-1.1 RFC.
http://tools.ietf.org/html/rfc2616#section-10.4.1
422 L'entité non traitable est définie par la RFC 4918 - WebDav. Notez qu'il y a une légère différence par rapport à 400, voir le texte cité ci-dessous.
Pour conserver une interface uniforme, vous devez utiliser 422 uniquement dans le cas des réponses XML et vous devez également prendre en charge tous les codes d'état définis par l'extension Webdav, pas seulement 422.
http://tools.ietf.org/html/rfc4918#page-78
Voir aussi le post de Mark Nottingham sur les codes de statut:
Comment penser aux codes d'état HTTP
la source
The following status codes are added to those defined in HTTP/1.1 [RFC2616].
Pour refléter l'état d'avancement en 2015:
D'un point de vue comportemental, les codes de réponse 400 et 422 seront traités de la même manière par les clients et les intermédiaires, donc cela ne fait en fait aucune différence concrète que vous utilisez.
Cependant, je m'attends à voir 400 actuellement plus largement utilisés, et en outre les clarifications que la spécification HTTPbis fournit en font le plus approprié des deux codes de statut:
Pour le contexte, HTTPbis est une révision de la spécification HTTP / 1.1 qui tente de clarifier les domaines qui n'étaient pas clairs ou incohérents. Une fois qu'il aura atteint le statut approuvé, il remplacera la RFC2616.
la source
Étude de cas: API GitHub
https://developer.github.com/v3/#client-errors
Peut-être que copier à partir d'API bien connues est une bonne idée:
la source
Il n'y a pas de bonne réponse, car cela dépend de la définition de la "syntaxe" pour votre demande. La chose la plus importante est que vous:
Avant que tout le monde me saute dessus pour dire qu'il n'y a pas de bonne ou de mauvaise réponse ici, permettez-moi d'expliquer un peu comment je suis arrivé à la conclusion.
Dans cet exemple spécifique, la question de l'OP concerne une demande JSON qui contient une clé différente de celle attendue. Maintenant, le nom de clé reçu est très similaire, du point de vue du langage naturel, à la clé attendue, mais il est, strictement, différent, et donc pas (généralement) reconnu par une machine comme étant équivalent.
Comme je l'ai dit plus haut, le facteur décisif est ce que l'on entend par syntaxe . Si la demande a été envoyée avec un type de contenu de
application/json
, alors oui, la demande est syntaxiquement valide car c'est une syntaxe JSON valide, mais pas sémantiquement valide, car elle ne correspond pas à ce qui est attendu. (en supposant une définition stricte de ce qui rend la demande en question sémantiquement valide ou non).Si, d'autre part, la demande a été envoyée avec un type de contenu personnalisé plus spécifique comme
application/vnd.mycorp.mydatatype+json
celui-ci, peut-être, spécifie exactement quels champs sont attendus, alors je dirais que la demande pourrait facilement être syntaxiquement invalide, d'où la réponse 400.Dans le cas en question, puisque la clé était erronée, pas la valeur , il y avait une erreur de syntaxe s'il y avait une spécification pour ce que sont les clés valides. S'il n'y avait pas de spécification pour des clés valides, ou si l'erreur était avec une valeur , ce serait une erreur sémantique .
la source
https://www.keycdn.com/support/422-unprocessable-entity/
la source
Votre cas:
HTTP 400
est le bon code d'état pour votre cas du point de vue REST car il est syntaxiquement incorrect à envoyersales_tax
au lieu detax
, bien que ce soit un JSON valide. Ceci est normalement appliqué par la plupart des infrastructures côté serveur lors du mappage du JSON aux objets. Cependant, certaines implémentations REST ignorent les nouveauxkey
objets JSON. Dans ce cas, unecontent-type
spécification personnalisée pour accepter uniquement les champs valides peut être appliquée côté serveur.Scénario idéal pour 422:
Dans un monde idéal, 422 est préférable et généralement acceptable pour envoyer comme réponse si le serveur comprend le type de contenu de l'entité de demande et la syntaxe de l'entité de demande est correcte mais n'a pas pu traiter les données car elles sont sémantiquement erronées.
Situations de 400 sur 422:
N'oubliez pas que le code de réponse 422 est un code d'état HTTP étendu (WebDAV). Il existe encore des clients HTTP / bibliothèques frontales qui ne sont pas prêts à gérer 422. Pour eux, c'est aussi simple que "HTTP 422 est faux, car ce n'est pas HTTP" . Du point de vue du service, 400 n'est pas tout à fait spécifique.
Dans l'architecture d'entreprise, les services sont déployés principalement sur des couches de services comme SOA, IDM, etc. Ils servent généralement plusieurs clients allant d'un très ancien client natif à un dernier client HTTP. Si l'un des clients ne gère pas HTTP 422, les options consistent à demander au client de mettre à niveau ou de modifier votre code de réponse en HTTP 400 pour tout le monde. D'après mon expérience, c'est très rare de nos jours mais c'est toujours une possibilité. Ainsi, une étude minutieuse de votre architecture est toujours requise avant de décider des codes de réponse HTTP.
Pour gérer une telle situation, les couches de service utilisent
versioning
ou configurent normalement unconfiguration
indicateur pour que les clients de conformité HTTP stricte envoient 400 et envoient 422 pour le reste d'entre eux. De cette façon, ils fournissent une prise en charge de la compatibilité descendante pour les consommateurs existants, mais offrent en même temps la possibilité aux nouveaux clients de consommer HTTP 422.La dernière mise à jour du RFC7321 indique:
Cela confirme que les serveurs peuvent envoyer HTTP 400 pour une demande non valide. 400 ne se réfère plus seulement à une erreur de syntaxe , cependant, 422 est toujours une réponse authentique à condition que les clients puissent la gérer.
la source
Tout d'abord, c'est une très bonne question.
400 Mauvaise demande - Lorsqu'une information critique manque dans la demande
Par exemple, l'en-tête d'autorisation ou l'en-tête du type de contenu. Ce qui est absolument requis par le serveur pour comprendre la demande. Cela peut différer d'un serveur à l'autre.
422 Entité non traitable - Lorsque le corps de la demande ne peut pas être analysé.
C'est moins grave que 400. La demande a atteint le serveur. Le serveur a reconnu que la demande avait la bonne structure de base. Mais les informations contenues dans le corps de la demande ne peuvent pas être analysées ou comprises.
par exemple
Content-Type: application/xml
lorsque le corps de la demande est JSON.Voici un article répertoriant les codes d'état et leur utilisation dans les API REST. https://metamug.com/article/status-codes-for-rest-api.php
la source
Vous devez en fait retourner "200 OK" et inclure dans le corps de la réponse un message sur ce qui s'est passé avec les données publiées. Ensuite, c'est à votre application de comprendre le message.
Le truc, c'est que les codes d'état HTTP sont exactement cela - des codes d'état HTTP. Et ceux-ci sont censés avoir un sens uniquement au niveau de la couche transport, pas au niveau de la couche application. La couche application ne devrait vraiment jamais savoir que HTTP est utilisé. Si vous avez changé votre couche de transport de HTTP à Pigeons voyageurs, cela ne devrait en aucun cas affecter votre couche d'application.
Permettez-moi de vous donner un exemple non virtuel. Disons que vous tombez amoureux d'une fille et qu'elle vous aime en retour, mais sa famille déménage dans un pays complètement différent. Elle vous donne sa nouvelle adresse e-mail. Naturellement, vous décidez de lui envoyer une lettre d'amour. Vous écrivez donc votre lettre, la mettez dans une enveloppe, écrivez son adresse sur l'enveloppe, y apposez un tampon et l'envoyez. Examinons maintenant ces scénarios
En bref: renvoyer "200 OK" ne signifie pas que l'application serveur a de bonnes nouvelles pour vous. Cela signifie seulement qu'il a des nouvelles.
PS: Le code d'état 422 n'a de signification que dans le contexte de WebDAV. Si vous ne travaillez pas avec WebDAV, alors 422 a exactement la même signification standard que tout autre code non standard = qui n'en est pas.
la source