Удаление ресурса с помощью http DELETE

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

DELETE /person/123

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

Ответ 1

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

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

Ответ 2

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

Метод DELETE является идемпотентным. Эта подразумевает, что сервер должен вернуться код ответа 200 (OK), даже если сервер удалил ресурс в предыдущий запрос. Но на практике, внедрение DELETE в качестве идемпотента операция требует, чтобы сервер сохранял отслеживать все удаленные ресурсы. В противном случае он может вернуть 404 (Not Найдено).

Ответ 3

Сначала DELETE: 200 или 204.

Последующие DELETE: 200 или 204.

Обоснование: DELETE должно быть идемпотентным. Если вы вернете 404 на второй DELETE, ваш ответ изменится с кода успеха на код ошибки. Клиентская программа может принимать неверные действия на основе предположения, что DELETE не удалось.

Пример:

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