Réponse REST correcte pour une table vide?

106

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: 404ou 204?

IMB
la source
19
Je répondrais avec 200 et une collection vide (pas un corps de réponse vide mais plutôt une collection sans éléments à l'intérieur, cela aura l'air différent selon le format retourné)
toniedzwiedz
4
404 dans ce contexte serait probablement mieux adapté pour «table not found». Je dirais de renvoyer une liste vide.
mata
2
@EJoshuaS Ce n'est pas le cas. Les deux questions sont les miennes et très anciennes. Ils sont similaires mais pas en double.
IMB
1
@EJoshuaS Ce ne sont évidemment pas des doublons. Cette question concerne le /api/usersmoment où celle-ci est sur le point /api/users/1.
Franklin Yu

Réponses:

230

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 200un jour et un 404le 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

Le serveur a répondu à la demande mais n'a pas besoin de renvoyer un corps d'entité et peut souhaiter renvoyer des méta-informations mises à jour.

Bien que cela puisse sembler raisonnable dans ce cas, je pense que cela dérouterait également les clients. A 204est 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 à une DELETEdemande ou peut-être déclencher un script qui n'a pas besoin de renvoyer de données. Dans le cas de api/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:

<users>
  <user>
    <id>1</id>
    <name>Tom</name>
  </user>
  <user>
    <id>2</id>
    <name>IMB</name>
  </user>
</users>

et si la liste est vide, vous pouvez simplement répondre avec quelque chose comme ceci (tout en utilisant toujours a 200):

<users/>

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.

toniedzwiedz
la source
4
Tout à fait d'accord. Et pour le repos, je voudrais simplement renvoyer un code d'état de 200 avec un tableau vide: [].
Chad Johnson
Logique. Pas besoin de rendre les choses plus difficiles. 404 serait déroutant.
Witold Kaczurba
Supposons une API qui décrit les pièces de monnaie dans votre poche, avec des points de terminaison: 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 /singleCoinvous obtiendrez 404 Not Found, mais lorsque vous demandez, GET /severalCoinsvous obtiendrez 200 OKune 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 obtenir 404 Not Found, car il n'y a pas de pièces dans votre poche.
sempasha
1
@sempasha Cela dépend de ce que vous entendez par GET /severalCoins. Si vous demandez que vous GET /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 /singleCoincela 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 /coinspoint 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 emply List<Coin>à Java, au lieu de null.
Franklin Yu
15

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).

Roman Nikitchenko
la source
10

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.

geek
la source
2

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?


  • '/ users' si est vide doit renvoyer '200'.
  • '/ users / 1' si l'identifiant n'est pas trouvé. devrait renvoyer 404.
Liva
la source
2

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.

Amir Raza
la source