web-dev-qa-db-fra.com

Bonne réponse REST pour une table vide?

Supposons que vous souhaitiez obtenir la liste des utilisateurs en appelant get à api/users mais actuellement la table a été tronquée donc il n'y a pas d'utilisateurs. Quelle est la réponse appropriée pour ce scénario 404 ou 204?

94
IMB

Je dirais non plus.

Pourquoi pas 404 (introuvable)?

Le code d'état 404 doit être réservé aux situations dans lesquelles une ressource est introuvable. 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'avais un 200 un jour et un 404 le lendemain juste parce que quelqu'un a supprimé deux utilisateurs. Qu'est-ce que je suis supposé faire? Mon URL est-elle incorrecte? Quelqu'un a-t-il modifié 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 vouloir renvoyer une métainformation mise à jour.

Bien que cela puisse sembler raisonnable dans ce cas, je pense que cela dérouterait également les clients. UNE 204 est censé indiquer qu'une opération a été exécutée avec succès et qu'aucune donnée ne doit être retournée. C'est parfait comme réponse à une requête DELETE ou peut-être en lançant un script qui n'a pas besoin de retourner des données. En 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 mentionné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 ça (tout en utilisant un 200):

<users/>

Dans les deux 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.

210
toniedzwiedz

Je répondrais à l'un des deux codes en fonction de la situation d'exécution:

404 (introuvable)

Cette réponse est assez correcte si vous n'avez pas de table. Pas seulement une table vide mais PAS DE TABLE UTILISATEUR. Cela confirme l'idée exacte - aucune ressource. D'autres options consistent à fournir plus de détails POURQUOI votre table est absente, il existe quelques codes plus détaillés, mais 404 est assez bon pour se référer à 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 que "votre demande est correcte, tout est OK mais vous ne correspondez à aucune donnée simplement parce que nous n'avons aucune donnée ou nous n'avons aucune donnée qui correspond à votre demande. Cela devrait être différent de la réponse au refus de sécurité. Je vote également pour renvoyer 200 dans la 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).

13
Roman Nikitchenko

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.

8
geek

Il devrait 200 OK avec une liste vide.

Pourquoi: Une table vide signifie que la table existe mais n'a aucun enregistrement.

404 Not Found signifie que le point final demandé n'existe pas.

0
Amir Raza