HTTP rozróżnia dwie właściwości:
- Idempotencja
- Bezpieczeństwo
Idempotencja jest definiowana przez specyfikację w następujący sposób:
Metody mogą również mieć właściwość „ idempotence ”, ponieważ (oprócz błędów związanych z błędem lub wygasaniem) skutki uboczne N> 0 identycznych żądań są takie same jak w przypadku pojedynczego żądania. Metody GET
, HEAD
, PUT
i DELETE
dzielić tę właściwość. Ponadto metody OPTIONS
i TRACE
NIE POWINNY mieć skutków ubocznych, a zatem są z natury idempotentne.
I bezpieczeństwo:
W szczególności ustanowiono konwencję, że metody GET
i NIE POWINNY mieć znaczenia innego niż odzyskanie. Metody te należy uznać za „ bezpieczne ”. Pozwala to aplikacje klienckie do reprezentowania innych metod, takich jak , i , w szczególny sposób, tak, że użytkownik jest świadomy faktu, że być może niebezpieczne działanie jest wymagane.HEAD
POST
PUT
DELETE
Oczywiście nie można zapewnić, że serwer nie generuje skutków ubocznych w wyniku wykonania GET
żądania; w rzeczywistości niektóre zasoby dynamiczne uważają tę funkcję. Ważnym rozróżnieniem jest tutaj to, że użytkownik nie zażądał skutków ubocznych, dlatego nie może być pociągnięty do odpowiedzialności za nie.
Zauważ, że bezpieczeństwo oznacza idempotencję: jeśli metoda nie ma skutków ubocznych, wielokrotne jej wykonanie przyniesie taki sam efekt uboczny, jak jednorazowe wykonanie, a mianowicie brak.
To dzieli metody na trzy kategorie:
- bezpieczny (a więc również idempotent):
GET
, HEAD
, OPTION
,TRACE
- idempotent ale niekoniecznie bezpieczne:
PUT
,DELETE
- ani idempotentny, ani bezpieczny:
POST
PUT nie musi mieć żadnych skutków ubocznych.
To jest złe. PUT
jest idempotentny, ale nie bezpieczny. Cały punkt o PUT
to, aby mieć efekt uboczny, mianowicie aktualizowanie zasobów. Idempotencja oznacza, że wielokrotne aktualizowanie tego samego zasobu o tej samej zawartości powinno mieć taki sam efekt, jak aktualizowanie go tylko raz.
Zwróć uwagę na ostatni akapit w rozdziale dotyczącym bezpieczeństwa [moje podkreślenie]:
Oczywiście nie można zapewnić, że serwer nie generuje skutków ubocznych w wyniku wykonania GET
żądania; w rzeczywistości niektóre zasoby dynamiczne uważają tę funkcję. Ważnym rozróżnieniem jest tutaj to, że użytkownik nie zażądał skutków ubocznych, dlatego nie może być pociągnięty do odpowiedzialności za nie .
Chociaż zdanie to mówi o GET
bezpieczeństwie, możemy założyć, że autorzy zamierzali również zastosować to samo rozumowanie PUT
i idempotencję. IOW: PUT
powinien mieć tylko jeden efekt uboczny widoczny dla użytkownika , a mianowicie aktualizację nazwanego zasobu. To może mieć inne skutki uboczne, ale użytkownik nie może być pociągnięty do odpowiedzialności za nich.
Na przykład fakt, że PUT
jest idempotentny, oznacza, że mogę próbować to tak często, jak chcę: specyfikacja gwarantuje , że wielokrotne wykonanie będzie dokładnie takie samo, jak wykonanie go raz. Całkowicie poprawne jest tworzenie zaległości starych wersji jako efekt uboczny tych wielu PUT
żądań. Jeśli jednak w wyniku wielu prób baza danych zapełni się zaległymi wersjami starych wersji, to nie jest mój problem, tylko twój.
IOW: możesz mieć tyle efektów ubocznych, ile chcesz, ale
- musi wyglądać na użytkownika tak, jakby jego żądania były idempotentne
- jesteś odpowiedzialny za te skutki uboczne, a nie użytkownik