Что такое правильный код состояния ответа на POST, если родительский ресурс не найден?

10

У меня есть следующая конечная точка:

a/{id}/b

и хочу создать bс отправкой POSTзапроса к нему. Если aс данным {id}не найдено, я должен ответить с 404 NOT_FOUNDили, может быть, с 409 CONFLICT?

Это просто для обработки a/{id}, хитрость в том, что здесь используется подресурс.

опал
источник

Ответы:

15

404 NOT FOUNDкажется правильным ответом, потому что ресурс с таким идентификатором не существует. Это очень ясно для понимания, и вы ожидаете того же ответа, если он a/{id}вызывается.

409 CONFLICTне кажется мне лучшим выбором, потому что в вашем примере вы вернете 409, когда родительский ресурс не был найден :).

Но помнит, что самое главное, чтобы быть последовательным в вашем API

Dherik
источник
Согласен. Если вы пытались записать в несуществующую папку, это конфликт или ошибка отсутствующей папки? Это кажется мне более интуитивным.
Нил
А под «папкой» вы подразумеваете путь, которого не существует?
Дерик
Я имею в виду папку, как в файловой системе.
Нил
Можете ли вы подробно описать сценарий? Потому что это зависит. Если папка ожидалась для сервера и (по какой-либо причине) там нет, я думаю, что это ошибка сервера (5xx), а не ошибка клиента (4xx). Если это значение папки было передано клиентом ресурсу (как id), это значение 404. Но если папка была передана в теле, это может быть что-то еще (412, 422 ... что-то для представления) проверка не удалась: папка делает не существует"). Это хороший вопрос, чтобы задать и обсудить.
Дерик
Если вы запрашиваете у сервера файл с путем /nonexistent/help.html, а папка / nonexistent не существует, то на это есть только один четкий ответ. 404 файл не найден! Может даже существовать /home/help.html, и ответ не будет отличаться. Ясно, что это приложение REST, но я не вижу причин, по которым логика могла бы измениться. Родитель должен существовать первым.
Нил
4

В дополнение к ответу @ Дерик.

URI являются идентификаторами , поэтому мы должны помнить, что ( /a/{id}/bэто идентификатор). URI не имеет смысла для WWW, и поэтому для клиента HTTP.

404 правильный ответ . По сути, сервер отвечает

Я не нашел ни одного ресурса с таким идентификатором. Ресурс не найден 1

Является ли отсутствующий ресурс родительским или дочерним, не имеет значения.

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

В случае сомнений не спрашивайте, какой код имеет смысл для вас (человека). Спросите, какой код имеет смысл для HTTP-клиента. Как вы хотите, чтобы HTTP-клиент вел себя?

Почему? Потому что некоторый код состояния заставляет этих клиентов выполнять определенные операции. Например, 302 . Этот код обычно заставляет веб-браузеры перенаправлять в определенное местоположение (URI), указанное в заголовках ответа.

Это может быть не ваш случай, но важно знать. В конечном итоге коды состояния HTTP адресованы клиентам HTTP. Не для наших приложений. Не для людей.


1: 409 редко реализуется как ошибка навигации. Обычно это включает выполнение удаленных операций (удаление, обновление, новые и т. Д.). Но URI должен существовать. В противном случае будет преобладать 404

LAIV
источник