web-dev-qa-db-fra.com

Quel code de réponse de statut HTTP dois-je utiliser si un paramètre requis est manquant dans la demande?

Je pense 412 (précondition a échoué) mais il peut y avoir une meilleure norme?

345
EA.

Le statut 422 semble le plus approprié en fonction de spec .

Le code de statut 422 (entité non traitable) signifie que le serveur comprend le type de contenu de l'entité de demande (par conséquent, un code de statut 415 (type de support non pris en charge) est inapproprié), et la syntaxe de l'entité de demande est correcte (par conséquent, une requête de type 400 (requête incorrecte)). ) le code d’état est inapproprié) mais n’a pas pu traiter les instructions contenues. Par exemple, cette condition d'erreur peut se produire si un corps de requête XML contient des instructions XML bien formées (c'est-à-dire syntaxiquement correctes), mais sémantiquement erronées.

Ils déclarent que xform malformé est un exemple de syntaxe incorrecte (appelant un 400). Une chaîne de requête mal formée semble analogue à celle-ci, donc 400 ne semble pas approprié pour une chaîne de requête bien formée pour laquelle il manque un paramètre.

UPDATE @DavidV indique correctement que cette spécification est pour WebDAV, pas pour HTTP. Mais certaines API populaires non WebDAV utilisent de toute façon 422, faute d'un meilleur code d'état ( voir ceci ).

341
Kelvin

Je ne suis pas sûr qu'il existe un standard, mais j'aurais utilisé 400 Bad Request:

La requête n'a pas pu être comprise par le serveur en raison d'une syntaxe mal formée. Le client NE DEVRAIT PAS répéter la demande sans modifications.

165
Gert Grenander

L'API WCF de .NET gère les paramètres manquants en renvoyant une erreur HTTP 404 "Endpoint Not Found" lors de l'utilisation de webHttpBinding .

Le 404 Not Found peut avoir un sens si vous considérez le nom de votre méthode de service Web ainsi que sa signature de paramètre. En d'autres termes, si vous exposez une méthode de service Web LoginUser(string, string) et que vous demandez LoginUser(string), cette dernière n'est pas trouvée.

En gros, cela signifie que la méthode de service Web que vous appelez, ainsi que la signature de paramètre que vous avez spécifiée, sont introuvables.

10.4.5 404 Introuvable

Le serveur n'a rien trouvé qui corresponde à l'URI de demande. Aucune indication n'est donnée quant à savoir si la condition est temporaire ou permanente.

Le 400 Bad Request, comme Gert suggère , reste un code de réponse valide, mais je pense qu'il est normalement utilisé pour indiquer des problèmes de niveau inférieur. Cela pourrait facilement être interprété comme une requête HTTP mal formée, peut-être des en-têtes HTTP manquants ou invalides, ou similaire.

10.4.1 400 mauvaise demande

La requête n'a pas pu être comprise par le serveur en raison d'une syntaxe mal formée. Le client NE DEVRAIT PAS répéter la demande sans modifications.

29
Daniel Vassallo

Vous pouvez envoyer un code 400 Bad Request. C'est l'un des codes d'état 4xx plus généraux, vous pouvez donc l'utiliser pour exprimer ce que vous souhaitez: le client envoie une demande qui manque des informations/paramètres nécessaires à votre application pour pouvoir la traiter correctement.

7
BoltClock

Dans l'un de nos projets d'API, nous décidons de définir un statut 409 sur une requête, lorsque nous ne pouvons pas le remplir à 100% à cause d'un paramètre manquant.

Le code d'état HTTP "409 Conflict" était pour nous un bon essai car sa définition nécessite d'inclure suffisamment d'informations pour permettre à l'utilisateur de reconnaître la source du conflit.

Référence: w3.org/Protocols/

Ainsi, entre autres réponses comme 400 ou 404, nous avons choisi 409 pour imposer la nécessité de revoir certaines notes de la demande, ce qui est utile pour configurer une nouvelle demande appropriée.

En tout cas, notre cas était particulier parce que nous devions envoyer des données même si la demande n’était pas tout à fait correcte, et nous devons obliger le client à regarder le message et à comprendre ce qui clochait dans la demande.

En général, si nous avons seulement quelques paramètres manquants , nous choisissons un 400 et un tableau de paramètre manquant. Mais lorsque nous avons besoin d'envoyer plus d'informations, comme un message de cas particulier et que nous voulons être plus sûrs que le client s'en occupera, nous envoyons un message d'erreur.

7
gabrielem

Je choisis généralement 422 (entité non traitable) si quelque chose dans les paramètres requis ne correspond pas à ce que le noeud final de l'API requiert (comme un mot de passe trop court), mais pour un paramètre manquant, je choisirais 406 (inacceptable).

7
Elad Meidar

J'utilise souvent une erreur 403 Forbidden. Le raisonnement est que la demande a été comprise, mais je ne vais pas faire comme demandé (parce que les choses ne vont pas). L'entité de réponse explique ce qui ne va pas. Si la réponse est une page HTML, les messages d'erreur sont dans la page. S'il s'agit d'une réponse JSON ou XML, les informations d'erreur sont là.

De rfc2616 :

10.4.4 403 interdit

Le serveur a compris la demande, mais refuse de l'exécuter.
L'autorisation n'aidera pas et la demande NE DEVRAIT PAS être répétée.
Si la méthode de la requête n'était pas HEAD et que le serveur souhaite effectuer
public pourquoi la demande n'a pas été satisfaite, il DEVRAIT décrire le motif du refus dans l'entité. Si le serveur ne souhaite pas mettre cette information à la disposition du client, le code d'état 404
(Introuvable) peut être utilisé à la place.

4
cdeszaq

On pourrait faire valoir qu'un 404 Not Found devrait être utilisé car la ressource spécifiée est introuvable.

3
Ray

Pour les personnes intéressées, Spring MVC (3.x au moins) renvoie 400 dans ce cas, ce qui me semble faux.

J'ai testé plusieurs URL Google (accounts.google.com) et supprimé les paramètres requis. Ils renvoient généralement un 404 dans ce cas.

Je copierais Google.

2
Neromancer