Удаление ресурса с помощью http DELETE - PullRequest
101 голосов
/ 22 июня 2011

Итак, учитывая, что глагол DELETE в Http идемпотентен, когда я выполняю следующий запрос, что должно произойти со вторым (или третьим, или четвертым и т. Д ...)?

DELETE /person/123

В первый раз ресурс удаляется и я возвращаю 204 (успешно, контента нет).Должен ли я вернуть 204 при последующих вызовах или 404 (не найдено)?

Ответы [ 3 ]

126 голосов
/ 22 июня 2011

Поскольку HTTP-запросы в системе без сохранения состояния должны быть независимыми, результаты одного запроса не должны зависеть от предыдущего запроса. Подумайте, что должно произойти, если два пользователя сделали УДАЛЕНИЕ одновременно на одном и том же ресурсе. Для второго запроса имеет смысл получить 404. То же самое должно быть верно, если один пользователь делает два запроса.

Я предполагаю, что возвращение DELETE двух разных ответов не кажется вам идемпотентным. Я считаю полезным думать о идемпотентных запросах, как о том, что система остается в том же состоянии и не обязательно имеет один и тот же ответ. Поэтому независимо от того, УДАЛИТЕ ли вы существующий ресурс или попытаетесь УДАЛИТЬ ресурс, который не существует, состояние ресурса сервера будет одинаковым.

27 голосов
/ 22 июня 2011

Поваренная книга веб-сервисов RESTful - отличный ресурс для этого.Случайно, Google Preview показывает страницу об УДАЛЕНИИ (стр. 11):

УДАЛИТЬ метод идемпотентен.Это подразумевает, что сервер должен вернуть код ответа 200 (ОК), даже если сервер удалил ресурс в предыдущем запросе.Но на практике реализация DELETE как идемпотентной операции требует, чтобы сервер отслеживал все удаленные ресурсы.В противном случае он может вернуть 404 (не найдено).

9 голосов
/ 19 июля 2017

Первое УДАЛЕНИЕ : 200 или 204.

Последующие УДАЛЕНИЯ : 200 или 204.

Обоснование : УДАЛЕНИЕ должно быть идемпотентным. Если вы вернете 404 при втором УДАЛЕНИИ, ваш ответ изменится с кода успеха на код ошибки . Клиентская программа может предпринять неверные действия, исходя из предположения, что УДАЛИТЬ не удалось.

Пример

  • Предположим, что ваша операция DELETE является частью многошаговой операции (или "саги"), выполняемой клиентской программой.
  • Клиентская программа может быть, например, мобильным приложением, выполняющим банковскую транзакцию.
  • Допустим, клиентская программа имеет автоматическую повторную попытку операции DELETE (это имеет смысл, поскольку предполагается, что DELETE является идемпотентом).
  • Допустим, первый DELETE был успешно выполнен, но ответ 200 был потерян на пути к клиентской программе.
  • Клиентская программа попытается УДАЛИТЬ.
  • Если вторая попытка вернет 404, клиентская программа может отменить всю операцию из-за этого кода ошибки.
  • Но поскольку первое УДАЛЕНИЕ успешно выполнено на сервере, система может остаться в несогласованном состоянии .
  • Если вторая попытка вернет 200 или 204, клиентская программа продолжит работу, как ожидалось.
...