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: вам разрешено иметь столько побочных эффектов, сколько вы хотите, но
- он должен выглядеть для пользователя, как если бы его запросы были идемпотентными
- Вы несете ответственность за эти побочные эффекты, а не пользователь