Imaginez une API pour identifier si une personne a sélectionné son animal spirituel. Ils ne peuvent avoir que zéro ou un animal spirituel.
Actuellement:
/person/{id}/selectedSpiritAnimal
quand ils ont sélectionné un animal retourne http 200 et {selectedAnimal:mole}
mais quand ils n'ont aucune sélection, il renvoie http 404.
Cela rend mon animal spirituel malheureux car nous représentons une préoccupation de domaine valide - n'ayant pas encore sélectionné un animal spirituel - comme une erreur HTTP.
De plus, en tant qu'entreprise - erm Sprit-Animal-Hampers-R-us - nous voulons savoir quand quelqu'un n'a pas de sélection afin que nous puissions les inciter.
Quelle est une meilleure réponse ici:
HTTP 200 et {selectedAnimal:null}
ou encore plus explicite
HTTP 200 et {selectedAnimal:null, spiritAnimalSelected: false}
Ou vaut-il mieux retourner une 404? Comme un peu comme this image has not yet been uploaded
lors de la visualisation d'une image en ligne serait un 404. this person has not selected a spirit animal
pourrait être un 404
Cette question a été proposée en tant que doublon, mais elle concerne une URL par ailleurs valide qui est demandée lorsque l'application a été configurée pour ne pas autoriser la modification que l'URL représente.
Alors que je regarde ici comment on représente une ressource où l'absence de la ressource est significative. C'est-à-dire qu'il est valide pour le client de demander l'URL et la réponse est que vous avez réussi à demander la ressource qui représente une absence de chose.
Il ne s'agit donc pas d'une `` logique commerciale '' mais plutôt d'une circonstance où l'absence de chose a un sens (il se peut que beaucoup de mes collègues soutiennent que 404 est toujours correct) mais je ne sais pas comment faire correspondre cela au spec.
Très difficile de choisir une réponse. J'ai changé d'avis plusieurs fois au cours de la conversation ici et de celle en cours au travail.
Ce qui m'arrange ici, c'est que la spécification dit qu'un 4xx, c'est quand le client s'est trompé . Dans ce cas, le client a été invité à attendre une réponse de l'URL selectedSpiritAnimal et n'a donc pas commis d'erreur.
Le consensus parmi mes collègues est que c'est le symptôme d'une mauvaise conception d'API
Il serait probablement préférable que nous demandions simplement / person / {id} et cela renvoie un ensemble de relations de lien pour la personne ... alors si vous ne recevez pas le lien / selectedSpiritAnimal (quand une personne n'a pas de sélection) mais vous appelez-le de toute façon alors un 404 a du sens. Ou que vous implémentiez des réponses partielles et que / person / {id} retourne un document plus complet à moins que le client ne demande un sous-ensemble des données