HTTP розрізняє два властивості:
Ідентифікація визначається специфікацією так:
Методи також можуть мати властивість " idempotence ", оскільки (окрім помилок чи проблем із закінченням терміну дії) побічні ефекти N> 0 однакових запитів такі самі, як і для одного запиту. Методи GET
, HEAD
, PUT
і DELETE
володіють цією властивістю. Крім того , методи OPTIONS
і TRACE
НЕ ПОВИННО мати побічні ефекти, і тому по своїй суті ідемпотентна.
І безпека:
Зокрема, було встановлено конвенцію про те, що методи GET
та HEAD
методи НЕ повинні мати значення для вжиття інших дій, ніж пошук. Ці методи слід вважати " безпечними ". Це дозволяє агентам користувача представляти інші методи, такі як POST
, PUT
і DELETE
, особливим чином, щоб користувач ознайомився з тим, що вимагається можлива небезпечна дія.
Природно, неможливо забезпечити, щоб сервер не генерував побічні ефекти в результаті виконання GET
запиту; насправді деякі динамічні ресурси вважають цю особливість. Тут важливим є те, що користувач не вимагав побічних ефектів, тому не може нести за них відповідальність.
Зауважте, що безпека передбачає ідентифікацію: якщо метод не має побічних ефектів, то його виконання кілька разів призведе до того ж побічного ефекту, що і один раз, а саме жодного.
Це розподіляє методи на три категорії:
- сейф (і , отже , також ідемпотентна)
GET
, HEAD
, OPTION
,TRACE
- ідемпотентів але не завжди безпечно:
PUT
,DELETE
- ні безпосереднім, ні безпечним:
POST
PUT не повинен мати побічних ефектів.
Це неправильно. PUT
є безсильним, але не безпечним. Весь сенс в PUT
це мати побічний ефект, а саме оновлення ресурсу. Що означає idempotency, це те, що оновлення одного і того ж ресурсу з тим самим вмістом кілька разів повинно мати такий же ефект, як оновлення його лише один раз.
Зверніть увагу на останній абзац у розділі про безпеку [наголос міни]:
Природно, неможливо забезпечити, щоб сервер не генерував побічні ефекти в результаті виконання GET
запиту; насправді деякі динамічні ресурси вважають цю особливість. Тут важливим є те, що користувач не вимагав побічних ефектів, тому не може нести за них відповідальність .
Хоча це речення говорить про GET
безпеку та безпеку, ми можемо припустити, що автори також мали на меті застосувати ті ж міркування PUT
та ідентичність. IOW: PUT
повинен мати лише один видимий для користувача побічний ефект, а саме оновлення названого ресурсу. У нього можуть бути й інші побічні ефекти, але користувач не може нести за них відповідальність.
Наприклад, той факт, що PUT
є ідентичним, означає, що я можу повторювати його так часто, як мені хочеться: специфікація гарантує, що його виконання кілька разів буде точно таким же, як його виконати один раз. Цілком справедливо створити відставання старих версій як побічний ефект цих кількох PUT
запитів. Однак, якщо в результаті багаторазових повторних робіт ваша база даних заповнить відсталі старі версії, це не моя проблема, це ваша.
IOW: вам дозволяється мати стільки побічних ефектів, скільки ви хочете, але
- він повинен виглядати перед користувачем так, ніби їхні запити ідентичні
- ви відповідаєте за ці побічні ефекти, а не за користувача