HTTP различает два свойства:
- идемпотентность
- безопасности
Идемпотентность определяется спецификацией следующим образом:
Методы также могут иметь свойство " идемпотентности ", заключающееся в том, что (кроме ошибок с ошибками или истечением срока действия) побочные эффекты от N> 0 идентичных запросов такие же, как и для одного запроса. Методы GET
, HEAD
, PUT
и DELETE
обладают этим свойством. Кроме того, методы OPTIONS
и TRACE
НЕ ДОЛЖНЫ иметь побочных эффектов, и поэтому по своей природе идемпотентны.
И безопасность:
В частности, соглашение было установлено , что GET
и HEAD
методы НЕ ДОЛЖНО иметь значение принимает меры, кроме поиска. Эти методы следует считать « безопасными ». Это позволяет пользовательским агентам представлять другие методы, такие как POST
, PUT
и DELETE
, особым образом, так, чтобы пользователь узнал о том, что запрашивается небезопасное действие.
Естественно, невозможно гарантировать, что сервер не генерирует побочные эффекты в результате выполнения GET
запроса; на самом деле, некоторые динамические ресурсы считают эту особенность. Важным отличием здесь является то, что пользователь не запрашивал побочные эффекты, поэтому не может нести за них ответственность.
Обратите внимание, что безопасность подразумевает идемпотентность: если метод не имеет побочных эффектов, то выполнение его несколько раз приведет к тому же побочному эффекту, что и однократное выполнение, а именно ни к одному.
Это помещает методы в три категории:
- сейф (и , следовательно , также идемпотентная)
GET
, HEAD
, OPTION
,TRACE
- идемпотентен но не всегда безопасно:
PUT
,DELETE
- не идемпотентный и не безопасный
POST
PUT не должен иметь побочных эффектов.
Это не правильно. PUT
идемпотентен, но не безопасен. Весь смысл в PUT
это иметь побочный эффект, а именно обновление ресурса. То, что означает идемпотентность, заключается в том, что обновление одного и того же ресурса с одним и тем же содержимым несколько раз должно иметь тот же эффект, что и обновление его только один раз.
Обратите внимание на последний абзац в разделе о безопасности [выделено мной]:
Естественно, невозможно гарантировать, что сервер не генерирует побочные эффекты в результате выполнения GET
запроса; на самом деле, некоторые динамические ресурсы считают эту особенность. Важным отличием здесь является то, что пользователь не запрашивал побочные эффекты, поэтому не может нести за них ответственность .
Хотя в этом предложении говорится и о GET
безопасности, мы можем предположить, что авторы также намеревались применить те же рассуждения PUT
и идемпотентность. IOW: PUT
должен иметь только один видимый пользователю побочный эффект, а именно обновление названного ресурса. У него могут быть другие побочные эффекты, но пользователь не может нести за них ответственность.
Например, тот факт, что PUT
идемпотентен, означает, что я могу повторить его так часто, как захочу: спецификация гарантирует, что выполнение его несколько раз будет точно таким же, как выполнение его один раз. Совершенно верно создать резерв старых версий как побочный эффект от этих многочисленных PUT
запросов. Однако, если в результате нескольких повторных попыток ваша база данных заполнится резервом старых версий, это не моя проблема, а ваша.
IOW: вам разрешено иметь столько побочных эффектов, сколько вы хотите, но
- он должен выглядеть для пользователя, как если бы его запросы были идемпотентными
- Вы несете ответственность за эти побочные эффекты, а не пользователь