Imagine una API para identificar si una persona ha seleccionado su animal espiritual. Solo pueden tener cero o un espíritu animal.
Actualmente:
/person/{id}/selectedSpiritAnimal
cuando han seleccionado un animal devuelve http 200 y {selectedAnimal:mole}
pero cuando no tienen selección, devuelve http 404.
Esto hace que mi espíritu animal sea infeliz ya que estamos representando un problema de dominio válido, ya que aún no hemos seleccionado un espíritu animal, como un error HTTP.
Además, como empresa, erm Sprit-Animal-Hampers-R-us, queremos saber cuándo alguien no tiene una selección para poder avisarle.
¿Cuál es una mejor respuesta aquí:
HTTP 200 y {selectedAnimal:null}
o incluso más explícito
HTTP 200 y {selectedAnimal:null, spiritAnimalSelected: false}
¿O es mejor devolver un 404? Dado que al igual que this image has not yet been uploadedal ver una imagen en línea, sería un 404. this person has not selected a spirit animalpodría ser un 404
Esta pregunta se ha propuesto como un duplicado, pero esa pregunta aborda una URL válida que se solicita cuando la aplicación se ha configurado para no permitir el cambio que representa la URL.
Mientras que aquí estoy viendo cómo uno representa un recurso donde la ausencia del recurso es significativa. Es decir, es válido que el cliente solicite la URL y la respuesta es que ha solicitado con éxito el recurso que representa la ausencia de una cosa.
Entonces, esto no es 'lógica de negocios', sino más bien una circunstancia en la que la ausencia de una cosa tiene sentido (puede ser que muchos de mis colegas estén argumentando que 404 todavía es correcto) pero no estoy seguro de cómo asignar eso al Especificaciones.
Muy difícil elegir una respuesta. He cambiado de opinión varias veces sobre la conversación aquí y la que está en curso en el trabajo.
Lo que me soluciona aquí es que la especificación dice que un 4xx es cuando el cliente ha cometido un error . En este caso, se le ha dicho al cliente que espere una respuesta de la url seleccionada de SpiritAnimal, por lo que no se ha equivocado.
El consenso entre mis colegas es que este es un síntoma de un mal diseño de API
Probablemente sería mejor que simplemente solicitemos / person / {id} y eso devuelva un conjunto de relaciones de enlace para la persona ... entonces, si no recibe el enlace / selectedSpiritAnimal (cuando una persona no tiene selección) pero usted llamarlo de todos modos, entonces un 404 tiene sentido. O que implemente respuestas parciales y deje que / person / {id} devuelva un documento más completo a menos que el cliente solicite un subconjunto de datos