Supposons que vous souhaitiez obtenir la liste des utilisateurs en appelant GET
à api/users
, mais actuellement, la table a été tronquée, il n'y a donc pas d'utilisateurs. Quelle est la réponse appropriée pour ce scénario: 404
ou 204
?
106
/api/users
moment où celle-ci est sur le point/api/users/1
.Réponses:
Je dirais non plus.
Pourquoi pas 404 (non trouvé)?
Le code d'état 404 doit être réservé aux situations dans lesquelles une ressource n'est pas trouvée. Dans ce cas, votre ressource est une collection d'utilisateurs . Cette collection existe mais elle est actuellement vide. Personnellement, je serais très confus en tant qu'auteur d'un client pour votre application si j'en avais un
200
un jour et un404
le lendemain simplement parce que quelqu'un avait supprimé quelques utilisateurs. Qu'est-ce que je suis supposé faire? Mon URL est-elle erronée? Quelqu'un a-t-il changé l'API et négligé de laisser une redirection.Pourquoi pas 204 (sans contenu)?
Voici un extrait de la description du code d'état 204 par w3c
Bien que cela puisse sembler raisonnable dans ce cas, je pense que cela dérouterait également les clients. A
204
est censé indiquer qu'une opération a été exécutée avec succès et qu'aucune donnée ne doit être renvoyée. C'est parfait comme réponse à uneDELETE
demande ou peut-être déclencher un script qui n'a pas besoin de renvoyer de données. Dans le cas deapi/users
, vous vous attendez généralement à recevoir une représentation de votre collection d'utilisateurs. Envoyer un corps de réponse une fois et ne pas l'envoyer l'autre fois est incohérent et potentiellement trompeur.Pourquoi j'utiliserais un 200 (OK)
Pour les raisons évoquées ci-dessus (cohérence), je retournerais une représentation d'une collection vide. Supposons que vous utilisez XML. Un corps de réponse normal pour une collection d'utilisateurs non vide pourrait ressembler à ceci:
et si la liste est vide, vous pouvez simplement répondre avec quelque chose comme ceci (tout en utilisant toujours a
200
):Dans tous les cas, un client reçoit un corps de réponse qui suit un certain format bien connu. Il n'y a pas de confusion inutile et de vérification du code d'état. De plus, aucune définition de code d'état n'est violée. Tout le monde est content.
Vous pouvez faire de même avec JSON ou HTML ou quel que soit le format que vous utilisez.
la source
[]
.GET /singleCoin
- renvoie une pièce unique aléatoire de votre poche,GET /severalCoins
- renvoie des pièces de votre poche que vous pouvez saisir en une seule fois. Disons que vous n'avez pas de pièces dans votre poche pour le moment. Lorsque vous demandez,GET /singleCoin
vous obtiendrez404 Not Found
, mais lorsque vous demandez,GET /severalCoins
vous obtiendrez200 OK
une liste vide[]
. Un fait - vous n'avez pas de pièces, décrites avec des réponses différentes, pourquoi? Je dirais qu'il vaut mieux toujours obtenir404 Not Found
, car il n'y a pas de pièces dans votre poche.GET /severalCoins
. Si vous demandez que vousGET /severalCoins
devez retourner des pièces, cela ne devrait pas être 200 car ce n'est pas OK; le serveur n'a pas réussi à fournir ce que le client voulait. Car/singleCoin
cela est évident car le client veut exactement une pièce, ni plus, ni moins. C'est la même chose pour/coins/7
. En revanche pour le/coins
point final, les clients ne s'attendent généralement à aucune pièce, une pièce ou plusieurs pièces. Tous sont des réponses valides. S'il n'y a pas de pièce, c'est ce qu'ils veulent. C'est comme un emplyList<Coin>
à Java, au lieu denull
.Je répondrais à l'un des deux codes en fonction de la situation d'exécution:
404 (non trouvé)
Cette réponse est assez correcte si vous n'avez pas de table. Pas seulement une table vide mais PAS DE TABLE DES UTILISATEURS. Cela confirme l'idée exacte - aucune ressource. D'autres options sont de fournir plus de détails POURQUOI votre table est absente, il y a quelques codes plus détaillés mais 404 est assez bon pour faire référence à une situation où vous n'avez vraiment pas de table.
200 (OK)
Tous les cas où vous avez une table mais elle est vide ou votre processeur de requêtes a filtré tous les résultats. Cela signifie `` votre demande est correcte, tout est OK mais vous ne correspondez à aucune donnée simplement parce que nous n'avons aucune donnée ou que nous n'avons aucune donnée qui correspond à votre demande. Cela devrait être différent de la réponse de refus de sécurité. Je vote également pour renvoyer 200 dans une situation où vous avez des données et en général vous êtes autorisé à accéder à la table mais n'avez pas accès à toutes les données qui correspondent à votre demande (les données ont été filtrées en raison de la sécurité au niveau de l'objet, mais en général, vous êtes autorisé à demande).
la source
Si vous attendez une liste d'objets utilisateur, la meilleure solution est de renvoyer une liste vide ([]) avec 200 OK plutôt que d'utiliser une réponse 404 ou 204.
la source
renvoie définitivement 200.
404 signifie que la ressource n'a pas été trouvée. Mais la ressource existe. Et aussi, si la réponse a le statut 404. Comment pouvez-vous savoir que la liste des utilisateurs est vide ou remplie?
la source
Il faut 200 OK avec une liste vide.
Pourquoi: table vide signifie que la table existe mais ne contient aucun enregistrement.
404 Not Found signifie que le point final demandé n'existe pas.
la source