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, PUTi DELETEdzielić tę właściwość. Ponadto metody OPTIONSi TRACE NIE POWINNY mieć skutków ubocznych, a zatem są z natury idempotentne.
I bezpieczeństwo:
W szczególności ustanowiono konwencję, że metody GETi 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.HEADPOSTPUTDELETE
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. PUTjest idempotentny, ale nie bezpieczny. Cały punkt o PUTto, 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 GETbezpieczeństwie, możemy założyć, że autorzy zamierzali również zastosować to samo rozumowanie PUTi idempotencję. IOW: PUTpowinien 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 PUTjest 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