Удаление ресурсов с помощью протокола HTTP удалить


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

DELETE /person/123

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

3 86

3 ответа:

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

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

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

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

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

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

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

пример:

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