Правильный код HTTP при попытке добавить подресурс, но нет родительского ресурса - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть два пути:

  • /students
  • /students/{id}/addresses

.. со следующим поведением:

  • POST до /students - 201 Created (при успешном создании ученика)
  • POST до /students/{id}/addresses - 201 Created (при успешном создании адреса по запрошенному ученику)

Теперь представьте ситуацию, когда я POST до /students/7/addresses, но нет Student с id = 7.Какой правильный код HTTP в этой ситуации?

Во-первых, я подумал, что это должно быть 404, с телом ответа, описывающим, что нет Student с id = 7, но я не уверен.

Что такоелучший подход в этой ситуации?

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Теперь представьте ситуацию, когда я отправляю сообщения по адресу / Students / 7 /, но нет ученика с id = 7. Какой правильный HTTP-код в этой ситуации?

Я ожидал бы, что в этом случае будет использоваться 404.

Как отмечается Evert , целью "подресурса" является красная сельдь;Что касается HTTP, то нет никакой связи, подразумеваемой под написанием /students/7 и /students/7/addresses.Это разные ресурсы.

(В этом вопросе есть некоторая путаница, поскольку в RFC 3986 обсуждается «иерархия» при обсуждении сегментов пути , но на самом деле речь идет о механике разрешения, икак точечные сегменты работают в относительном разрешении. Мы можем выровнять нашу иерархию идентификаторов с сегментами пути, но HTTP не предъявляет этого требования, и универсальные компоненты не могут предполагать, что это так).

Так что POST к /students/7/addresses нужно понимать изолированно.Семантика HTTP очень похожа на семантику хранилища значений ключей - целевой URI запроса - это ключ, который дает вам доступ к представлениям.

В вашем конкретном случае у вас есть ключ, который ссылается на ресурс, которыйв настоящее время не существует в магазине.Это звучит очень похоже на 404 Not Found .

Код состояния 404 (Not Found) указывает, что исходный сервер не нашел текущее представление для целевого ресурсаили не желает раскрывать, что он существует.

Тело ответа обычно включает дополнительную информацию о том, что происходит, но мы, вероятно, хотим, чтобы общие компоненты HTTP воспринимали это так, как если бы это была орфографическая ошибка.в URL.

Майкл Кропат Хватит усложнять имеет полезное дерево решений для вопросов о кодах статуса.

0 голосов
/ 14 декабря 2018

HTTP на самом деле не знает об иерархии.Там нет понятия родительского и вспомогательных ресурсов.Мы (как разработчики API) добавляем эту концепцию.

Однако есть и другой способ решения этой проблемы.Вы говорите, что ресурс A не может быть создан, если ресурс B не существует.

Общий код состояния для этого - 409 Conflict.Конфликт предполагает, что, хотя сам запрос является действительным, состояние другого ресурса не позволяет ему быть успешным.Если состояние других ресурсов изменится (вы создаете ресурс студента), начальный запрос будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...