W artykule wiki dla REST wskazano, że jeśli używasz http://example.com/resources DELETE, oznacza to, że usuwasz całą kolekcję.
Jeśli używasz http://example.com/resources/7HOU57Y DELETE, oznacza to, że usuwasz ten element.
Robię STRONĘ INTERNETOWĄ, uwaga NIE SERWIS INTERNETOWY.
Mam listę zawierającą 1 pole wyboru dla każdej pozycji na liście. Po wybraniu wielu elementów do usunięcia, pozwolę użytkownikom nacisnąć przycisk o nazwie USUŃ WYBÓR. Jeśli użytkownik naciśnie przycisk, pojawi się okno dialogowe js z prośbą o potwierdzenie usunięcia. jeśli użytkownik potwierdzi, wszystkie pozycje zostaną usunięte.
Jak więc powinienem zająć się usuwaniem wielu elementów w PEWNY sposób?
UWAGA, obecnie dla DELETE na stronie internetowej, co robię, to używam znacznika FORM z POST jako akcją, ale dołączam _method z wartością DELETE, ponieważ jest to to, co zostało wskazane przez innych w SO, jak zrobić RESTful delete dla strony internetowej .
Odpowiedzi:
Myślę, że odpowiedź rojoca jest jak dotąd najlepsza. Niewielką różnicą może być wyeliminowanie potwierdzenia javascript na tej samej stronie, a zamiast tego utworzenie zaznaczenia i przekierowanie do niego, wyświetlając komunikat potwierdzający na tej stronie. Innymi słowy:
Od:
http://example.com/resources/
zrób
POST z wyborem identyfikatorów do:
http://example.com/resources/selections
który, jeśli się powiedzie, powinien odpowiedzieć:
Utworzono protokół HTTP / 1.1 201 i nagłówek lokalizacji:
http://example.com/resources/selections/DF4XY7
Na tej stronie zobaczysz następnie pole potwierdzenia (javascript), które po potwierdzeniu wykona żądanie:
USUŃ http://example.com/resources/selections/DF4XY7
który, jeśli się powiedzie, powinien odpowiedzieć: HTTP / 1.1 200 Ok (lub cokolwiek jest odpowiednie do pomyślnego usunięcia)
źródło
http://example.com/resources/selections/
aw ładunku (treści) żądania wysyłasz dane, dla których chcesz usunąć elementy. O ile wiem, nic nie stoi na przeszkodzie, abyś to zrobił, ale zawsze spotyka mnie „ale to nie jest RESTfull”.Jedną z opcji jest utworzenie „transakcji” do usunięcia. Więc
POST
do czegoś w rodzajuhttp://example.com/resources/deletes
nowego zasobu składającego się z listy zasobów do usunięcia. Następnie w swojej aplikacji wystarczy usunąć. Kiedy wysyłasz wiadomość, powinieneś zwrócić lokalizację utworzonej transakcji, nphttp://example.com/resources/deletes/DF4XY7
. AGET
na tym może zwrócić status transakcji (zakończona lub w toku) i / lub listę zasobów do usunięcia.źródło
Oto, co Amazon zrobił ze swoim interfejsem API S3 REST.
Indywidualne żądanie usunięcia:
Żądanie usunięcia wielu obiektów :
Ale Facebook Graph API , Parse Server REST API i Google Drive REST API idą jeszcze dalej, umożliwiając „grupowanie” poszczególnych operacji w jednym żądaniu.
Oto przykład z Parse Server.
Indywidualne żądanie usunięcia:
Żądanie partii:
źródło
Powiedziałbym DELETE http://example.com/resources/id1,id2,id3,id4 lub DELETE http://example.com/resources/id1+id2+id3+id4 . Ponieważ „REST jest architekturą (…) [nie] protokołem”, cytując ten artykuł w Wikipedii, nie ma, jak sądzę, jednego sposobu na zrobienie tego.
Zdaję sobie sprawę, że powyższe nie jest możliwe bez JS z HTML, ale mam wrażenie, że REST był:
źródło
Co ciekawe, myślę, że ta sama metoda ma zastosowanie do PATCHOWANIA wielu jednostek i wymaga zastanowienia się, co mamy na myśli z naszym adresem URL, parametrami i metodą REST.
zwraca wszystkie elementy „foo”:
[GET] api/foo
zwraca elementy „foo” z filtrowaniem pod kątem określonych identyfikatorów:
[GET] api/foo?ids=3,5,9
W jakim sensie adres URL i filtr określają „z jakimi elementami mamy do czynienia?”, A metoda REST (w tym przypadku „GET”) mówi „co zrobić z tymi elementami?”.
Dlatego PATCH wiele rekordów, aby oznaczyć je jako przeczytane
[PATCH] api/foo?ids=3,5,9
..z danymi foo [odczyt] = 1
Wreszcie, aby usunąć wiele rekordów, ten punkt końcowy jest najbardziej logiczny:
[DELETE] api/foo?ids=3,5,9
Proszę zrozumieć, że nie wierzę w żadne „zasady” w tym zakresie - dla mnie to po prostu „ma sens”
źródło
Jak mówi odpowiedź Decent Dabbler i odpowiedź rojocas , najbardziej kanonicznym jest użycie zasobów wirtualnych do usunięcia wybranych zasobów, ale myślę, że jest to niepoprawne z perspektywy REST, ponieważ wykonanie
DELETE http://example.com/resources/selections/DF4XY7
powinno usunąć sam zasób selekcji, a nie wybrane zasoby.Biorąc pod uwagę odpowiedź Macieja Piechotki lub odpowiedź fezfox , mam tylko zastrzeżenie: istnieje bardziej kanoniczny sposób przekazywania tablicy identyfikatorów i używa operatora tablicy:
DELETE /api/resources?ids[]=1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d&ids[]=7e8f9a0b-1c2d-3e4f-5a6b-7c8d9e0f1a2b
W ten sposób atakujesz punkt końcowy Usuń kolekcję, ale filtrujesz usunięcie za pomocą zapytania w odpowiedni sposób.
źródło
Ponieważ nie ma `` właściwego '' sposobu, aby to zrobić, w przeszłości zrobiłem:
wyślij DELETE na adres http://example.com/something z danymi zakodowanymi w formacie XML lub JSON w treści.
kiedy otrzymasz żądanie, sprawdź, czy nie ma opcji DELETE, jeśli prawda, a następnie przeczytaj treść tych, które mają zostać usunięte.
źródło
A payload within a DELETE request message has no defined semantics; sending a payload body on a DELETE request might cause some existing implementations to reject the request.
z tools.ietf.org/html/rfc7231#section-4.3.5Miałem tę samą sytuację, aby usunąć wiele elementów. Oto, co ostatecznie zrobiłem. Użyłem operacji DELETE, a identyfikatory elementów, które miały zostać usunięte, były częścią nagłówka HTTP.
źródło