Представьте веб-службу REST, где вы добавляете элементы в какой-либо тип контейнера. Например, скажем, мы могли бы добавить участника # 789 к событию # 456 следующим образом:
PUT http://..../api/v1/events/456/attendees/789
Если какое-либо событие # 456 или участник # 789 не существует, правильно ли возвращать HTTP 404 (вместе с подробной информацией о полезной ошибке, объясняющей, в чем проблема, например { "error" : { "message" : "Event 456 does not exist" , "code" : "404" } }
?
Аналогично, что, если я создаю что-то новое, которое ссылается на другой объект, но другой объект не существует? Например, представьте, что я создаю событие в Location # 123
PUT http://..../api/v1/event
{ "location": 123, "name": "Party", "date": "2012-05-23", ...etc... }
Если Location № 123 не существует, также верно ли возвращать 404 (вместе с деталями в ответ)? Если нет, то что было бы уместно - всего 400?
В соответствии с спецификацией HTTP 1.1 http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
9.6 PUT... Если ресурс не может быть создан или изменен с помощью Request-URI, следует дать соответствующий ответ об ошибке, который отражает характер проблемы.
Итак, это было бы хорошим голосованием за ответ с помощью 404. Однако по какой-то причине я не могу положиться, отвечая на PUT (или POST) с 404, кажется мне странным... Возможно, это потому что 404 означает, что ресурс не найден, но в этом случае наш ресурс на самом деле является связующим звеном между двумя другими ресурсами, и это один из тех двух ресурсов, которые не могут быть найдены.
Не слишком беспокоитесь о моих точных примерах здесь - они составлены, чтобы проиллюстрировать суть. Главный вопрос: 404 - соответствующий ответ на операцию PUT, которая терпит неудачу, потому что связанный ресурс не найден?
Было бы замечательно, если бы вы могли указать на ссылки - мне трудно найти какие-либо данные, которые попадают на этот уровень детализации, а также достаточно правдоподобны. Особенно в отношении отношения ресурсов к ресурсам в проекте REST API.
Обновленное мышление Я думаю, что, возможно, первый пример должен вернуть 404, второй - не должен. Причиной является то, что в первом случае добавляемый ресурс использует событие 456 и участника 789 в качестве составного первичного ключа; второй случай - это только внешний ключ. Во втором случае ошибка должна быть возвращена, но не 404 - возможно, условие 412 Precondition Failed или может быть просто 400 Bad Request. Мысли?