Quel est le code d'état HTTP le plus approprié pour une page d'erreur "élément non trouvé"

117

Je suis curieux de savoir quel est le code d'état HTTP le plus approprié pour une page "élément n'existe pas".

Si la page elle-même n'existe pas, j'utiliserai évidemment 404. Cependant, une de mes pages a un useridargument (c'est une page "modifier l'utilisateur") et au cas où aucun utilisateur avec l'ID utilisateur donné n'existe, j'affiche un page d'erreur, mais j'aimerais aussi envoyer un en-tête d'état 4xx (puisque "200 OK" ne convient pas vraiment).

Je suppose que 404 serait correct car il est "non trouvé" et non "fichier non trouvé", mais je me demande s'il existe un meilleur code pour ce cas.

ThiefMaster
la source

Réponses:

139

Être trop intelligent avec des codes d'erreur HTTP obscurs est une mauvaise idée. Les navigateurs réagissent parfois de manière inutile qui obscurcit la situation. Tenez-vous en à 404.

bmargulies
la source
14
Merde pour avoir donné de bons conseils: (Le TOC à pas 404 tout est réel cependant.
Carrie Kendall
16
Les erreurs 404 sont quelque peu ambiguës pour différencier un mauvais URI d'une entité non trouvée. Un nouveau code standard est nécessaire pour lever l'ambiguïté des 404.
Breakskater
2
Je préfère renvoyer 204 contenus vides que de renvoyer un code d'état
ambigus
46

Un code de retour 404 signifie en fait «ressource non trouvée» et s'applique à toute entité pour laquelle une demande a été faite mais non satisfaite. Cela fonctionne donc aussi bien pour les pages, les sous-sections de pages et tout élément existant sur la page qui a une demande spécifique à rendre.

Donc, 404 est le bon code à utiliser dans ce scénario. Notez que cela ne s'applique pas au «serveur non trouvé», qui est une situation différente dans laquelle une demande a été émise mais n'a pas du tout de réponse, par opposition à une réponse mais sans la ressource demandée.

Gourou huit bits
la source
1
Que faire si je veux mettre à jour l'objet foo avec id = 1 et qu'il n'y a pas de toto dans la base de données avec cet identifiant?
valijon
1
Dans ce scénario, vous avez un problème de concurrence à résoudre: si vous avez récupéré un objet avec id = 1 et qu'il n'existe plus lorsque vous essayez de le mettre à jour, un autre thread ou processus a ignoré votre verrou (ou vous n'en avez pas défini) et l'a supprimé. Ce n'est pas bon. Sinon, si vous essayez de mettre à jour l'objet id = n (où n vous est fourni) sans d'abord vérifier son existence, vous manquez une étape de validation dans votre logique de mise à jour, ce qui n'est pas non plus bon.
Eight-Bit Guru
8

Cela dépend si userid est un identifiant de ressource ou un paramètre supplémentaire. Si c'est le cas, vous pouvez renvoyer 404 sinon vous pouvez renvoyer un autre code comme

400 (bad request) ‐ indicates a bad request
ou
412 (Precondition Failed) e.g. conflict by performing conditional update

Plus d'informations dans le livre gratuit InfoQ explore: REST .

cetnar
la source
1
En disant «paramètre supplémentaire», voulez-vous dire le champ d'en-tête de la demande? Sinon, je ne recommanderais pas d'utiliser 412. "Le code d'état 412 (précondition échoué) indique qu'une ou plusieurs conditions données dans les champs d'en-tête de la demande ont été évaluées à false lors du test sur le serveur."
oferei