Ludzie opracowujący HTTP / 2 byli o wiele bardziej otwarci na temat tego, co powinien zrobić HTTP, zachowując stare znaczenie. Zobaczmy, co ma do powiedzenia wersja robocza HTTP / 2 na temat idempotence:
4.2.2 Idempotentne metody
Metodę żądania uważa się za „idempotentną”, jeśli zamierzony efekt na serwerze wielu identycznych żądań z tą metodą jest taki sam jak efekt dla pojedynczego takiego żądania. W przypadku metod żądań zdefiniowanych w tej specyfikacji PUT, DELETE i bezpieczne żądanie metody są idempotentne.
Podobnie jak definicja sejfu, właściwość idempotent ma zastosowanie tylko do tego, czego zażądał użytkownik; serwer może rejestrować każde żądanie osobno, zachować historię kontroli wersji lub wdrożyć inne nie idempotentne skutki uboczne dla każdego żądania idempotentnego .
Zamierzony efekt na serwerze dla każdego takiego żądania PUT jest zaktualizować zasób zidentyfikowany przez tego URI . Tak właśnie dzieje się w twoim przypadku.
To, że zdecydujesz się na wersję zasobów, tak naprawdę nie ma znaczenia. Jeśli nie chcesz tworzyć nowej wersji, gdy nic się nie zmieniło, musisz porównać ładunek w żądaniu PUT z najnowszą (lub w inny sposób zidentyfikowaną) wersją zasobu i gdy żadna z właściwości nie uległa zmianie możesz nie tworzyć nowej wersji .
Twoja edycja:
Historia będzie widoczna dla użytkownika, wielokrotne wywołanie spowodowałoby wiele konwersji
Jeśli chodzi o zasób, nie jest to efektem ubocznym . Zasób pod tym identyfikatorem URI nie zmienia się (te same właściwości otrzymują PUT). Historia to tylko metadane, ponieważ najprawdopodobniej jest ona wymagana przez inny identyfikator URI lub z różnymi nagłówkami żądania.
time
właściwość zostanie zaktualizowana? Myślę, że to także metadane, nawet jeśli znajdują się w zasobie.HTTP rozróżnia dwie właściwości:
Idempotencja jest definiowana przez specyfikację w następujący sposób:
I bezpieczeństwo:
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:
GET
,HEAD
,OPTION
,TRACE
PUT
,DELETE
POST
To jest złe.
PUT
jest idempotentny, ale nie bezpieczny. Cały punkt oPUT
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]:
Chociaż zdanie to mówi o
GET
bezpieczeństwie, możemy założyć, że autorzy zamierzali również zastosować to samo rozumowaniePUT
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 wieluPUT
żą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
źródło
Masz rację, że PUT nie musi mieć żadnych skutków ubocznych , ale dodałbym coś do tego.
Aktualizujesz
person
zasób, który jest zidentyfikowany jakoF02E395A235
, więc użycie PUT jest poprawne. Teraz jako reguła biznesowa śledzisz również zmiany, które są niewidoczne dla podmiotu wywołującego (konsumenta usługi REST). To nie doda nowego elementu doperson
zasobu. Historyczna migawka nie będzie dostępna przy użyciu/person/
punktu końcowego. Uważam więc, że PUT powinien być w tym przypadku całkowicie do przyjęcia.źródło