Мой вопрос: должен ли я возвращать код ответа HTTP 400 Bad Request, 404 Not Found или 410 Gone, если родительский ресурс или выше не существует или был удален?
Ищу некоторые рекомендации о том, как обрабатывать отсутствующие ссылки в дереве ресурсов RESTful, так как я читал довольно много, но не много личного опыта.
Скажем, у нас есть структура ресурсов ниже:
/users/{userId}/accounts/{accoundId}/logs/{logId}
У одного пользователя может быть много учетных записей, которые, в свою очередь, могут иметь много заказов, которые, в свою очередь, могут иметь много журналов. Журналы существуют только для одной учетной записи, а учетные записи существуют только для одного пользователя. Журналы не могут существовать без учетной записи, а учетные записи не могут существовать без пользователя.
Моя проблема возникает, когда я пытаюсь решить следующее:
/users/123/accounts/321/logs - POST
/users/123/accounts/321/logs/987 - GET
/users/123/accounts/321/logs/987 - PUT
/users/123/accounts/321/logs/987 - DELETE
/users/123/accounts/321/logs/987 - PATCH
/users/123/accounts/321/logs/987 - HEAD
Но этого ресурса нет или больше не существует:
/users/123/accounts/321
или этот ресурс не существует или больше не существует:
/users/123
Я мог бы возразить, что это неверный запрос 400, который согласно RFC7231:
6.5.1. ошибка 400, неверный запрос
Код состояния 400 (Bad Request) указывает на то, что сервер не может или не будет обрабатывать запрос из-за чего-то, что воспринимается как ошибка клиента (например, неверный синтаксис запроса, неверный кадр сообщения запроса или обманчивая маршрутизация запросов).
Будет по определению верным, за исключением случая, когда срок действия кеша еще не истек, что означает, что приложению еще предстоит повторно пройти иерархию, а другое приложение удалило родительский ресурс. Предоставив соответствующую оппозиционную блокировку, клиент докажет, что, согласно последним данным, он делал семантически правильный запрос.
Я инстинктивно одолжил бы на 404 Not Found или 410 Gone, даже если бы это не было кешем, поскольку причиной сбоя был буквально отсутствующий/недоступный ресурс. Однако согласно спецификации RFC7231:
6.5.4. 404 Не Найдено
Код состояния 404 (не найдено) указывает на то, что исходный сервер не нашел текущего представления для целевого ресурса или не желает раскрывать его существование. Код состояния 404 не указывает, является ли это отсутствие представления временным или
постоянным; код состояния 410 (ушел) предпочтительнее, чем 404, если исходный сервер
знает, предположительно с помощью некоторых настраиваемых средств, что состояние, вероятно, будет постоянным.
or
6.5.9. 410 ушел
Код состояния 410 (Gone) указывает на то, что доступ к целевому
ресурсу больше недоступен на исходном сервере и что это
состояние, скорее всего, будет постоянным.
Казалось бы, они лгут этому инстинкту.
Есть ли у кого-нибудь опыт работы с этим или подобными сценариями и хорошими подходами? Я чувствую, что должен исходить из того, что мне кажется правильным и что я ожидаю увидеть при использовании этой услуги, а не буквы текста.