Действительно ли REST DELETE идемпотент?

DELETE предполагается идемпотентным.

Если я удалю http://example.com/account/123, он удалит учетную запись.

Если я сделаю это снова, я ожидаю 404, так как аккаунт больше не существует? Что делать, если я пытаюсь УДАЛИТЬ учетную запись, которая никогда не существовала?

Ответ 1

Idempotence относится к состоянию системы после завершения запроса


Во всех случаях (кроме ошибок - см. ниже) учетная запись больше не существует.

От здесь

"Методы могут также обладать свойством" идемпотентность "в том, что (в стороне от ошибки или срока действия). побочные эффекты N > 0 одинаковы запросы такие же, как для одного запрос. Методы GET, HEAD, PUT и DELETE делятся этим свойством. Также, методы ВАРИАНТЫ и ТРАСЕ СЛЕДУЕТ НЕ имеют побочных эффектов, и поэтому по своей сути идемпотент."


Ключевым битом является побочные эффекты N > 0 одинаковых запросов, такие же, как для одного запроса.

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

Ответ 2

Idempotent - это эффект запроса, а не код ответа, который вы получаете.

http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1.2 говорит:

Методы могут также обладать свойством "идемпотентность" в этом (кроме ошибки или срока действия) побочные эффекты N > 0 одинаковы запросы такие же, как для одного запрос.

Пока вы можете получить другой код ответа, эффект отправки N + 1 запросов DELETE на один и тот же ресурс можно считать одинаковым.

Ответ 3

Из HTTP RFC:

Методы могут также иметь свойство "idempotence" в том, что (помимо ошибок или ошибок истечения) побочные эффекты N > 0 одинаковых запросов такие же, как и для одного запроса.

Обратите внимание, что "побочные эффекты", а не "ответ".

Ответ 4

Я думаю то же самое, 404 - Учетная запись не существует.

Вы можете утверждать 400 - Bad Request. Но в смысле REST объект, который вы просили выполнить действие, не существует. Это означает 404.

Ответ 5

Важным отличием является то, что идемпотент относится к побочным эффектам, а не к последствиям или ответам. Если вы выполняете DELETE http://example.com/account/123, то эффект заключается в том, что учетная запись 123 теперь удаляется с сервера. Это единственный и единственный эффект - одно и только изменение состояния сервера. Теперь позвольте сказать, что вы повторите тот же запрос DELETE http://example.com/account/123, сервер ответит иначе, но его состояние будет одинаковым.

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