DELETE ma być idempotentne.
Jeśli USUWAM http://example.com/account/123 , konto zostanie usunięte.
Jeśli zrobię to ponownie, czy spodziewałbym się 404, ponieważ konto już nie istnieje? Co się stanie, jeśli spróbuję USUNĄĆ konto, które nigdy nie istniało?
http
rest
http-headers
Ben Noland
źródło
źródło
Odpowiedzi:
Idempotencja odnosi się do stanu systemu po zakończeniu żądania
We wszystkich przypadkach (z wyjątkiem problemów z błędami - patrz poniżej) konto już nie istnieje.
od tutaj
Bit klucza, który powoduje skutki uboczne N> 0 identycznych żądań, jest taki sam, jak w przypadku pojedynczego żądania.
Mógłbyś oczekiwać, że kod statusu będzie inny, ale nie wpływa to na podstawową koncepcję idempotencji - możesz wysłać żądanie więcej niż jeden raz bez dodatkowych zmian stanu serwera.
źródło
Idempotent dotyczy skutku żądania, a nie kodu odpowiedzi, który otrzymujesz.
http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1.2 mówi:
Chociaż możesz otrzymać inny kod odpowiedzi, efekt wysłania N + 1 żądań DELETE do tego samego zasobu można uznać za taki sam.
źródło
Ważną różnicą jest to, że idempotentne odnosi się do skutków ubocznych , a nie do wszystkich skutków lub reakcji. Jeśli zrobisz,
DELETE http://example.com/account/123
efekt jest taki, że konto 123 jest teraz usuwane z serwera. To jedyny efekt, jedyna zmiana stanu serwera. Teraz powiedzmy, że robisz to samoDELETE http://example.com/account/123
żądanie, serwer odpowie inaczej, ale jego stan jest taki sam.To nie tak, że żądanie DELETE zdecydowało o zmianie stanu serwera w inny sposób, ponieważ brakowało konta, na przykład usunięcie innego konta lub pozostawienie dziennika błędów. Nie, możesz wywołać to samo żądanie DELETE milion razy i możesz być pewien, że serwer jest w tym samym stanie, w jakim był przy pierwszym wywołaniu .
źródło
Z HTTP RFC :
Zauważ, że to „skutki uboczne”, a nie „reakcja”.
źródło
Tak. Niezależnie od kodu odpowiedzi.
Z najnowszego RFC dla HTTP 1.1 (wyróżnienie moje):
Wyraźnie mówi, że odpowiedź może się różnić. Co ważniejsze, wskazuje na przyczynę koncepcji: jeśli akcja jest idempotentna, klient może powtórzyć akcję, gdy napotka jakikolwiek błąd i wie, że w ten sposób niczego nie zawiesi; jeśli nie, klient będzie musiał wykonać dodatkowe zapytanie (prawdopodobnie
GET
), aby sprawdzić, czy poprzednie jest skuteczne, zanim bezpiecznie powtórzy akcję. Dopóki serwer może dać taką gwarancję, akcja jest idempotentna. Cytat z innego komentarza :źródło
Myślę tak samo, 404 - Konto nie istnieje.
Możesz argumentować, że 400 - złe żądanie. Ale w sensie REST obiekt, na którym zażądałeś wykonania akcji, nie istnieje. To przekłada się na 404.
źródło
Cytat z mojej innej odpowiedzi tutaj :
Historycznie rzecz biorąc, specyfikacja RFC 2616, opublikowana w 1999 r., Była najczęściej wymienianą specyfikacją HTTP 1.1. Niestety jego opis idempotencji był niejasny , co pozostawia miejsce na wszystkie te debaty. Ale ta specyfikacja została zastąpiona przez RFC 7231. Cytat z RFC 7231, sekcja 4.2.2 Idempotent Methods , wyróżnienie moje:
Tak więc jest napisane w specyfikacji, idempotencja dotyczy wpływu na serwer. Pierwsze DELETE zwracające 204, a następnie DELETE zwracające 404, taki inny kod stanu NIE powoduje, że DELETE nie jest idempotentny. Użycie tego argumentu do uzasadnienia kolejnego zwrotu 204 jest po prostu nieistotne.
OK, więc nie chodzi o idempotencję. Ale w takim razie pytanie uzupełniające może brzmieć, co jeśli nadal zdecydujemy się użyć 204 w kolejnym DELETE? Czy to jest w porządku?
Dobre pytanie. Motywacja jest zrozumiała: pozwolić klientowi na osiągnięcie zamierzonego wyniku, bez martwienia się o obsługę błędów. Powiedziałbym, że zwrócenie 204 w kolejnym DELETE jest w dużej mierze nieszkodliwym „białym kłamstwem” po stronie serwera, którego strona klienta nie zauważy od razu różnicy. Dlatego są ludzie, którzy robią to na wolności i nadal działa. Pamiętaj tylko, że takie kłamstwo można uznać za dziwne semantycznie, ponieważ „GET / non-exist” zwraca 404, ale „DELETE / non-exist” daje 204, w tym momencie klient zorientowałby się, że Twoja usługa nie jest w pełni zgodna sekcja 6.5.4 404 nie znaleziono .
Ale z drugiej strony, zamierzony sposób wskazany przez RFC 7231, tj. Zwrócenie 404 przy kolejnym DELETE, nie powinien być problemem w pierwszej kolejności. Wielu innych programistów zdecydowało się to zrobić. Jest tak prawdopodobnie dlatego, że każdy klient, który implementuje HTTP DELETE (lub jakąkolwiek metodę HTTP, jeśli o to chodzi), nie założyłby ślepo, że wynik zawsze będzie pomyślny 2xx. A potem, gdy programista zacznie rozważać obsługę błędów, błąd 404 Not Found byłby jednym z pierwszych błędów, jakie przyjdą na myśl. W tym momencie, mam nadzieję, wyciągnąłby wniosek, że zignorowanie błędu 404 jest semantycznie bezpieczne dla operacji HTTP DELETE. Problem rozwiązany.
źródło