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

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

DELETE /person/123

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

3 ответов


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

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


поваренная книга веб-сервисов RESTful-отличный ресурс для этого. Случайно,его Google preview показать страницу об удалении (стр. 11):

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


удалить: 200 или 204.

Последующие Удаления: 200 или 204.

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

пример:

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