web-dev-qa-db-fra.com

Quel code d'état HTTP utiliser pour les paramètres requis non fournis?

J'ai plusieurs pages conçues pour être appelées avec AJAX - Je leur fais retourner un code d'état anormal si elles ne peuvent pas être affichées, et mon javascript affichera une boîte d'erreur en conséquence.

Par exemple, si l'utilisateur n'est pas authentifié ou que sa session a expiré et qu'il essaie d'appeler l'une des pages AJAX, il renverra 401 Unathorized.

J'ai aussi un retour 500 Internal Server Error si quelque chose de vraiment bizarre se produit côté serveur.

Quel code d'état dois-je retourner si l'une de ces pages a été appelée sans les paramètres requis? (et ne peut donc pas renvoyer de contenu).

J'ai jeté un œil au article de wikipedia sur les codes de statut HTTP , mais le plus proche que j'ai pu trouver du code que je cherchais était le suivant:

422 Entité non traitable
La demande était bien formée mais n'a pas pu être suivie en raison d'erreurs sémantiques.

Modifier: Le code ci-dessus est spécifique à WebDAV et donc peu susceptible d'être approprié dans ce cas

Quelqu'un peut-il penser à un code approprié à retourner?

54
Alex Coplan

Quel code d'état dois-je retourner si l'une de ces pages a été appelée sans les paramètres requis? (et ne peut donc pas renvoyer de contenu).

Vous pouvez choisir 404 Not Found:

Le serveur n'a rien trouvé qui correspond à l'URI de la demande [en supposant que vos paramètres requis font partie de l'URI, c'est-à-dire $_GET]. Aucune indication n'est donnée quant à savoir si la condition est temporaire ou permanente. Le code d'état 410 (disparu) DEVRAIT être utilisé si le serveur sait, par le biais d'un mécanisme configurable en interne, qu'une ancienne ressource est indisponible en permanence et n'a pas d'adresse de transfert. Ce code d'état est couramment utilisé lorsque le serveur ne souhaite pas révéler exactement pourquoi la demande a été refusée, ou lorsqu'aucune autre réponse n'est applicable.

(mettre en évidence par moi)

404 Not Found est un sous-ensemble de 400 Bad Request ce qui pourrait aussi être pris car il est très clair de quoi il s'agit:

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

Je ne peux pas réellement suggérer que vous choisissiez un code de réponse WEBDAV qui n'existe pas pour les clients HTTP utilisant l'hypertexte, mais vous pourriez, c'est totalement valide, vous êtes le codeur du serveur, vous pouvez réellement prendre n'importe quel code d'état de réponse HTTP que vous jugez bon pour votre client HTTP dont vous êtes également le concepteur:

11.2. 422 Entité non traitable

Le code d'état 422 (entité non traitable) signifie que le serveur comprend le type de contenu de l'entité de demande (donc un code d'état 415 (type de support non pris en charge) est inapproprié) et la syntaxe de l'entité de demande est correcte (donc 400 (mauvaise demande) ) 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.

L'entité de demande de l'IIRC est l'organisme de demande. Donc, si vous travaillez avec des corps de demande, cela pourrait être approprié, comme l'a écrit Julian.


Vous avez commenté:

À mon humble avis, le texte de 400 parle de syntaxe mal formée. Je suppose que la syntaxe se rapporte ici à la syntaxe de la chaîne HTTP que le client envoie au serveur.

Cela pourrait être, mais cela peut être n'importe quoi exprimé syntaxiquement, la demande entière, seulement certains en-têtes de demande, ou un en-tête de demande spécifique, l'URI de la demande, etc. une erreur client:

La classe de code d'état 4xx est destinée aux cas dans lesquels le client semble s'être trompé. Sauf lorsqu'il répond à une demande HEAD, le serveur DEVRAIT inclure une entité contenant une explication de la situation d'erreur, et s'il s'agit d'une condition temporaire ou permanente. Ces codes d'état sont applicables à toute méthode de demande Les agents utilisateurs DEVRAIENT afficher toute entité incluse à l'utilisateur.

La partie importante est ici que vous devez dire au client ce qui ne va pas. Le code d'état indique simplement que quelque chose s'est mal passé (dans la classe 4xx), mais HTTP n'a pas été spécifiquement conçu pour rendre un paramètre de partie info-requête manquant comme condition d'erreur. En fait, l'URI sait seulement qu'il y a une partie info-requête et non ce qu'elle signifie.

Si vous pensez que 400 est trop large, je vous suggère de choisir 404 si le problème est lié à l'URI, par ex. $_GET variables.

40
hakre

Je ne connais pas les intentions des rédacteurs RFC, mais le code d'état que j'ai vu utilisé dans la nature pour ce cas est 400 Bad Request.

9
AndreKR

422 est un code d'état HTTP standard; et il est utilisé en dehors de WebDAV. Contrairement à ce que disent les autres, cela ne pose aucun problème; HTTP a un registre de code d'état pour une raison.

Voir http://www.iana.org/assignments/http-status-codes

7
Julian Reschke

Description telle que citée contre 400

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

(Souligner le mien)

Cela parle d'une syntaxe mal formée, ce qui n'est pas le cas lorsque le navigateur envoie une requête au serveur. C'est juste le cas de paramètres manquants (alors qu'il n'y a pas de syntaxe mal formée).

Je suggère de s'en tenir à 404 :)

(Les experts me corrigent si je me trompe quelque part :))

1
UltraInstinct

Lisez ceci attentivement:

https://en.wikipedia.org/wiki/List_of_HTTP_status_codes

422 est une chose spécifique à WebDAV, et je ne l'ai pas vu utilisé pour autre chose.

400, même s'il n'est pas destiné à cet usage particulier, semble être un choix courant.

404 est également un choix viable si votre API est RESTful ou similaire (en utilisant la partie chemin de l'URI pour indiquer les paramètres de recherche)

0
tdammers