Представьте себе API, чтобы определить, выбрал ли человек свое духовное животное. У них может быть только ноль или одно духовное животное.
В настоящее время:
/person/{id}/selectedSpiritAnimal
когда они выбрали животное возвращает http 200 и {selectedAnimal:mole}
но когда у них нет выбора, возвращается http 404.
Это делает мое духовное животное несчастным, поскольку мы представляем действительную проблему домена - еще не выбрав духовное животное - как ошибку HTTP.
Кроме того, как бизнес, а именно Sprit-Animal-Hampers-R-us, мы хотим знать, когда у кого-то нет выбора, поэтому мы можем подсказать им.
Какой лучший ответ здесь:
HTTP 200 и {selectedAnimal:null}
или даже более явно
HTTP 200 и {selectedAnimal:null, spiritAnimalSelected: false}
Или лучше вернуть 404? Так как this image has not yet been uploaded
при просмотре изображения онлайн было бы 404. this person has not selected a spirit animal
может быть 404
Этот вопрос был предложен как дубликат, но этот вопрос касается запрашиваемого в противном случае действительного URL-адреса, когда приложение настроено так, чтобы не допустить изменения, которое представляет этот URL-адрес.
В то время как здесь я смотрю на то, как каждый представляет ресурс, где отсутствие ресурса имеет смысл. Т.е. клиент может запросить URL-адрес, и ответом является то, что вы успешно запросили ресурс, который представляет отсутствие объекта.
Так что это не «бизнес-логика», а скорее обстоятельство, при котором отсутствие вещи имеет значение (возможно, многие мои коллеги утверждают, что 404 по-прежнему верен), но я не уверен, как сопоставить это с спекуляция
Очень сложно подобрать ответ. Я передумал несколько раз за разговор здесь и тот, который продолжается на работе.
Дело в том, что для меня это решается тем, что в спецификации говорится, что 4xx - это ошибка клиента . В этом случае клиенту было сказано ожидать ответа от URL выбранного selectedSpiritAnimal, поэтому он не допустил ошибку.
Консенсус среди моих коллег в том, что это признак плохого дизайна API
Вероятно, было бы лучше, если бы мы просто запросили / person / {id}, и это возвращает набор отношений ссылки для человека ... тогда, если вам не дают ссылку / selectedSpiritAnimal (когда у человека нет выбора), но вы в любом случае, называть это 404 имеет смысл. Или что вы реализуете частичные ответы и позволяете / person / {id} возвращать более полный документ, если клиент не запрашивает подмножество данных