web-dev-qa-db-fra.com

Utilisez 404 ou 200 lorsque le résultat est nul (REST)

Supposons que nous avons une entité

{
    "id": 1
    "inProgress": true,
}

Nous avons des points finaux:

  • /api/v1/entities/ pour récupérer toutes les entités,
  • /api/v1/entities/1 pour récupérer l'entité avec id = 1
  • /api/v1/entities/in-progress pour récupérer l'entité en cours. Notez qu'il ne peut y avoir qu'une seule entité en cours.

Maintenant, nous pouvons avoir 2 situations pour /api/v1/entities/in-progress:

  1. il y a une entité en cours
  2. il n'y a aucune entité en cours en ce moment

Quel code d'état doit être retourné pour le 2 e cas?

404 - introuvable

Ça a l'air bien, car il n'y a pas d'entité. En outre, pour 404, HTTP indique The requested resource could not be found but may be available again in the future. Subsequent requests by the client are permissible.

2

Cela semble également correct, car la demande a réussi, mais pourquoi devrions-nous retourner un résultat nul?

204

La demande a réussi mais il n'y a aucun résultat. Ce qui semble également convenir.

Quel code de statut utiliseriez-vous et pourquoi?

9
Maxian Nicu

Les codes d'état HTTP dans la plage 4xx signifient des erreurs client. Je ne pense donc pas que l'utilisation d'un 404 soit applicable ici. Si vous considérez qu'il s'agit d'une erreur client, vous dites également que le client doit avoir des connaissances sur l'état du serveur, ce qui indique une conception fortement couplée.

Comme JimmyJames l'a bien dit dans ses commentaires,

404 signifie "Je ne sais pas de quoi vous parlez". C'est très différent de "Je sais exactement ce que vous demandez mais il n'y a pas de données".

Mais vous dites qu'une seule entité peut être en cours à tout moment. Cela ressemble à une règle métier et si vous décidez de ne renvoyer qu'un seul objet dans l'URL, votre interface reflète les règles métier.

Je vous suggère d'envisager de renvoyer un tableau à partir du in-progress url. Incidemment, vous pouvez obtenir un tableau avec zéro ou un résultat.

Peut-être même changer cela pour être une requête, donc vous demandez /api/v1/entities?in-progress=true

23
Pete