Qu'est-ce qu'un code de statut HTTP approprié à retourner par un service API REST pour un échec de validation?

je retourne actuellement 401 non autorisé chaque fois que je rencontre une défaillance de validation dans mon application Django / Piston basée sur L'API REST. Ayant eu un oeil au registre de code de statut HTTP Je ne suis pas convaincu que ce soit un code approprié pour un échec de validation, que recommandez-vous?

  • 400 Bad Request
  • 401 non autorisé
  • 403 Interdit
  • 405 Méthode Non Autorisée
  • 406 Inacceptable
  • 412 Échec De La Condition Préalable
  • 417 Expectative Failed
  • 422 Entité Non Traitable
  • 424 Échec De La Dépendance

Update : "échec de Validation" ci-dessus signifie échec de la validation des données au niveau de l'application, c.-à-D. DATE-HEURE mal spécifiée, adresse courriel fausse, etc.

314
demandé sur George Stocker 2009-12-25 01:34:52

7 réponses

si" échec de validation " signifie qu'il y a une erreur de client dans la requête, alors utilisez HTTP 400 (mauvaise requête). Par exemple, si L'URI est supposé avoir une date ISO-8601 et que vous trouvez qu'il est dans le mauvais format ou se réfère au 31 février, alors vous retournerez un HTTP 400. Idem si vous attendez XML bien formé dans un corps d'entité et il ne parvient pas à analyser.

(1/2016): au cours des cinq dernières années WebDAV 's plus spécifique HTTP 422 (Unprocessable Entity) est devenu une alternative très raisonnable au HTTP 400. Voir par exemple son utilisation dans API JSON . Mais notez que HTTP 422 A et non transformé en HTTP 1.1, RFC-7231 .

Richardson and Ruby RESTful Web Services contient une annexe très utile sur le moment d'utiliser les divers codes de réponse HTTP. Ils disent:

400 ("Mauvaise Demande")

Importance: Élevée.

Il s'agit de l'état d'erreur générique côté client, utilisé lorsqu'aucun autre code d'erreur 4xx n'est approprié. Il est couramment utilisé lorsque le client soumet une représentation avec un Mettre ou afficher la demande, et la représentation est dans le bon format, mais il ne fait pas a aucun sens. (p. 381)

et:

401 ("non autorisé")

Importance: Élevée.

Le client a essayé d'utiliser une ressource protégée sans fournir les justificatifs d'authentification appropriés. Il peut avoir fourni les informations d'identification de mal, ou pas du tout. Les justificatifs d'identité peuvent être un nom d'utilisateur et un mot de passe, une clé API, ou une authentification jeton-quel que soit le service en question est attend. C'est courant pour un client de faire une demande pour une URI et d'accepter 401 juste pour qu'il sache quel type d'informations d'identification pour envoyer et dans quel format. [...]

241
répondu Jim Ferrans 2017-06-19 17:49:04

De la RFC 4918 (et aussi documenté à http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml ):

le code D'État 422 (Entité non traitable) désigne le serveur comprend le type de contenu de l'entité 415 (Type de média non pris en charge) code de statut est inapproprié), et le la syntaxe de l'entité de requête est correcte (donc une 400 (mauvaise requête) le code d'état est inapproprié) mais n'a pas été capable de traiter le contenu instruction. Par exemple, cette condition d'erreur peut se produire si un XML du corps de la requête contient bien formé (c'est à dire, syntaxiquement correctes), mais instructions XML sémantiquement erronées.

74
répondu ReWrite 2017-01-09 03:39:42

un duplicata dans la base de données doit être un 409 CONFLICT .

je recommande d'utiliser 422 UNPROCESSABLE ENTITY pour les erreurs de validation.

je donne une explication plus longue des codes 4xx ici: http://parker0phil.com/2014/10/16/REST_http_4xx_status_codes_syntax_and_sematics/

20
répondu Phil Parker 2014-10-16 23:06:37

le voici:

rfc2616#section-10.4.1-400 Bad Request

la requête n'a pas pu être comprise par le serveur en raison de mal formé la syntaxe . Le client ne doit pas répéter la requête sans modifications.

rfc7231#section-6.5.1-6.5.1. 400 Bad Request

le 400 (Mauvaise requête) le code d'état indique que le serveur ne peut pas ou ne traitera pas la demande en raison de quelque chose qui est perçu pour être une erreur de client (par exemple, une syntaxe de requête mal formée, un cadrage de message de requête invalide ou un routage de requête trompeur) .

se réfère à des cas mal formés (pas bien formés)!

rfc4918 - 11.2. 422 Entité Non Traitable

le code D'État 422 (Entité non traitable) signifie le serveur

comprend le type de contenu de l'entité de requête (par conséquent, un code d'état 415 (Type de média non appuyé) n'est pas approprié), et la syntaxe de l'entité de requête est correcte (par conséquent, un code d'état 400 (mauvaise requête) n'est pas approprié), mais n'a pas été en mesure de traiter les instructions contenues. Par exemple, cette condition d'erreur peut se produire si un XML le corps de la requête contient des instructions XML bien formées (c'est-à-dire syntaxiquement correctes), mais sémantiquement erronées .

Conclusion

règle empirique: [ _ ] 00 couvre le cas le plus général et les cas qui ne sont pas couverts par le code désigné.

422 s'adapte le mieux à l'objet de validation d'erreur (précisément, ma recommandation:)

Comme pour la validation sémantiquement erronée - pensez à quelque chose comme" ce nom d'utilisateur existe déjà".

400 est utilisé de façon incorrecte pour objet de validation

11
répondu honzajde 2017-08-26 21:16:54

je dirais que techniquement, il pourrait ne pas être une défaillance HTTP, puisque la ressource a (probablement) été valablement spécifié, l'Utilisateur a été authentifié, et il n'y a pas eu de défaillance opérationnelle (cependant, même la spécification comprend certains codes réservés comme 402 paiement requis qui ne sont pas strictement parlant HTTP liés non plus, bien qu'il pourrait être souhaitable d'avoir cela au niveau du protocole afin que tout appareil peut reconnaître la condition).

Si c'est effectivement le cas, je ajouterait un champ de statut à la réponse avec des erreurs d'application, comme

4plage de Date n'est pas valide

7
répondu jspcal 2011-04-06 04:39:12

il y a un peu plus d'informations sur la sémantique de ces erreurs dans RFC 2616 , qui documente HTTP 1.1.

personnellement, j'utiliserais probablement 400 Bad Request , mais c'est juste mon opinion personnelle sans aucun support factuel.

1
répondu andri 2009-12-24 22:38:40

Que voulez-vous dire par "échec de validation"? De quoi êtes-vous de la validation? Faites-vous référence à quelque chose comme une erreur de syntaxe (par exemple XML malformé)?

si c'est le cas, je dirais que 400 mauvaise requête est probablement la bonne chose, mais sans savoir ce que vous "validez", c'est impossible à dire.

0
répondu Nicholas Knight 2009-12-24 22:38:43