Czy jest coś innego niż REST w podawaniu parametrów w żądaniu HTTP DELETE?
Mój scenariusz jest taki, że modeluję „Czy na pewno chcesz to usunąć?” scenariusz. W niektórych przypadkach stan zasobu sugeruje, że żądane usunięcie może być nieprawidłowe. Prawdopodobnie możesz sobie wyobrazić scenariusze, w których wymagane jest potwierdzenie usunięcia
Rozwiązaniem, które przyjęliśmy, jest przekazanie parametru do żądania usunięcia, aby wskazać, że można kontynuować usuwanie („? Force_delete = true”)
na przykład
DELETE http://server/resource/id?force_delete=true
Uważam, że od:
(a) Semantyka DELETE nie jest zmieniana - użytkownik nadal może wysłać normalne żądanie DELETE, ale może się to nie udać z 409, a treść odpowiedzi wyjaśni dlaczego. Mówię, że może się nie powieść, ponieważ (z powodów nie wartych wyjaśnienia) w niektórych przypadkach nie ma powodu, aby monitować użytkownika.
(b) W rozprawie Roya nic nie sugeruje, że jest to sprzeczne z duchem REST - dlaczego miałoby istnieć, skoro HTTP jest tylko jedną implementacją REST, więc dlaczego przekazywanie parametrów HTTP ma znaczenie
Czy ktoś może wskazać mi ostateczne stwierdzenie, które wyjaśnia powód, dla którego nie jest to RESTful?
W przypadku pokrewnego pytania, jeśli użytkownik nie określi force_delete, to zwracam 409 Conflict
- czy to jest najbardziej odpowiedni kod odpowiedzi?
Zagryźć
Po dalszych badaniach myślę, że dodanie parametrów do DELETE może naruszyć kilka zasad.
Po pierwsze, implementacja prawdopodobnie narusza „Uniform Interface” (patrz sekcja 5.1.5 rozprawy Roya
Dodając „force_delete” dodajemy dodatkowe ograniczenie do już dobrze zdefiniowanej metody DELETE. To ograniczenie ma znaczenie tylko dla nas.
Można również argumentować, że narusza to „5.1.2 klient-serwer”, ponieważ okno dialogowe potwierdzenia dotyczy naprawdę interfejsu użytkownika i znowu nie wszyscy klienci będą chcieli potwierdzić usunięcie.
Sugestie ktoś?
Odpowiedzi:
Nie, to nie jest RESTful. Jedynym powodem, dla którego powinieneś umieszczać czasownik (
force_delete
) w identyfikatorze URI, jest przeciążenie metod GET / POST w środowisku, w którym metody PUT / DELETE nie są dostępne. Sądząc po zastosowaniu metody DELETE, tak nie jest.Kod błędu HTTP
409/Conflict
powinien być używany w sytuacjach, w których występuje konflikt uniemożliwiający usłudze RESTful wykonanie operacji, ale nadal istnieje szansa, że użytkownik sam będzie mógł rozwiązać konflikt. Potwierdzenie przed usunięciem (gdzie nie ma rzeczywistych konfliktów, które uniemożliwiłyby usunięcie) nie jest konfliktem per se, ponieważ nic nie stoi na przeszkodzie, aby API wykonało żądaną operację.Jak powiedział Alex (nie wiem, kto go przegłosował, ma rację), powinno się to załatwić w interfejsie użytkownika, ponieważ usługa RESTful jako taka tylko przetwarza żądania i dlatego powinna być bezpaństwowa (tj. Nie może polegać na potwierdzeniach przez przytrzymanie wszelkie informacje po stronie serwera dotyczące żądania).
Oto dwa przykłady, jak to zrobić w interfejsie użytkownika:
(*) Należy pamiętać, że wersje HTML wcześniejsze niż 5 nie obsługują natywnie metod PUT i DELETE HTTP, jednak większość nowoczesnych przeglądarek może wykonywać te dwie metody za pośrednictwem wywołań AJAX. Zobacz ten wątek, aby uzyskać szczegółowe informacje na temat obsługi różnych przeglądarek.
Aktualizacja (na podstawie dodatkowego dochodzenia i dyskusji):
Scenariusz, w którym usługa wymagałaby
force_delete=true
obecności flagi, narusza jednolity interfejs zdefiniowany w rozprawie Roya Fieldinga. Ponadto, zgodnie z protokołem HTTP RFC , metoda DELETE może zostać zastąpiona na serwerze pochodzenia (kliencie), co oznacza, że nie jest to wykonywane na serwerze docelowym (usłudze).Więc gdy usługa otrzyma żądanie DELETE, powinna je przetworzyć bez konieczności dodatkowego potwierdzenia (niezależnie od tego, czy usługa faktycznie wykonuje operację).
źródło
force_delete=true
? Zgodnie z protokołem HTTP RFC metoda DELETE może zostać zastąpiona na serwerze pochodzenia (kliencie), co oznacza, że nie jest to wykonywane na serwerze docelowym (usłudze). Rozumiem więc, że gdy usługa otrzyma żądanie DELETE, powinna je przetworzyć bez potrzeby żadnego potwierdzenia (niezależnie od tego, czy usługa faktycznie wykonuje operację).Myślę, że to nie jest uspokajające. Nie sądzę, aby uspokajająca usługa spełniała wymóg zmuszania użytkownika do potwierdzenia usunięcia. Poradziłbym sobie z tym w interfejsie użytkownika.
Czy określenie force_delete = true ma sens, jeśli jest to interfejs API programu? Jeśli ktoś pisał skrypt usuwający ten zasób, czy chciałbyś zmusić go do określenia force_delete = true, aby faktycznie usunąć zasób?
źródło
To stare pytanie, ale oto kilka komentarzy ...
źródło
Oprócz odpowiedzi Alexa:
Zauważ, że http: // server / resource / id? Force_delete = true identyfikuje inny zasób niż http: // server / resource / id. Na przykład ogromna różnica polega na tym, czy usuniesz / customers /? Status = old czy / customers /.
źródło