web-dev-qa-db-fra.com

Qu'est-ce qu'un bon code d'état de réponse à POST lorsque la ressource parent n'est pas trouvée?

J'ai le point de terminaison suivant:

a/{id}/b

et souhaitez créer une b en lui envoyant une requête POST. Si a avec {id} Donné n'est pas trouvé, dois-je répondre avec 404 NOT_FOUND Ou peut-être avec 409 CONFLICT?

Il s'agit de gérer simplement a/{id}, L'astuce est qu'ici une sous-ressource est utilisée.

10
Opal

404 NOT FOUND semble la réponse appropriée, car la ressource avec cet ID n'existe pas. C'est très clair à comprendre et vous attendez la même réponse si a/{id} est appelé.

409 CONFLICT me semble pas le meilleur choix, car dans votre exemple, vous retournerez un 409 lorsque la ressource parent était introuvable :).

Mais se souvient que la chose la plus importante est d'être cohérent dans votre API

15
Dherik

En plus de la réponse de @ Dherik.

Les URI sont des identifiants , nous devons donc garder à l'esprit que (/a/{id}/b est un identifiant). URI n'a pas de sens pour le WWW, tout comme pour le client HTTP.

404 est la bonne réponse . En substance, le serveur répond

Je n'ai trouvé aucune ressource avec un tel identifiant. Ressource introuvable  1

Que la ressource manquante soit parent ou enfant n'a pas d'importance.

Nous, développeurs, voyons les hiérarchies et chemins dans l'URI, mais pas les clients HTTP. En d'autres termes, HTTP est uniquement destiné à être interprété par les clients HTTP mais pas par les humains (développeurs, utilisateurs finaux, etc.).

En cas de doute, ne demandez pas quel code a du sens pour vous (humain). Demandez-vous quel code a du sens pour le client HTTP. Comment voulez-vous que le client HTTP se comporte?

Pourquoi? Parce qu'un code d'état oblige ces clients à effectuer certaines opérations. Par exemple, 2. Ce code oblige généralement les navigateurs Web à rediriger vers un emplacement spécifique (URI) informé dans les en-têtes de réponse.

Ce n'est peut-être pas votre cas, mais il est important d'en être conscient. En fin de compte, les codes d'état HTTP sont adressés aux clients HTTP. Pas à nos applications. Pas aux personnes.


1: 409 est rarement implémenté comme erreur de navigation. Cela implique généralement l'exécution d'opérations à distance (suppression, mise à jour, nouvelle, etc.). Mais l'URI devrait exister. Sinon, 404 prévaudra

4
Laiv