Jaki jest sposób usuwania wielu elementów w trybie REST?
Moim przypadkiem jest to, że mam kolekcję Backbone, w której muszę mieć możliwość jednoczesnego usuwania wielu elementów. Wydaje się, że opcje są następujące:
- Wyślij żądanie DELETE dla każdego rekordu (co wydaje się złym pomysłem, jeśli potencjalnie są dziesiątki elementów);
- Wyślij DELETE, gdzie identyfikatory do usunięcia są połączone razem w adresie URL (tj. „/ Records / 1; 2; 3”);
- W sposób inny niż REST wyślij niestandardowy obiekt JSON zawierający identyfikatory oznaczone do usunięcia.
Wszystkie opcje są mniej niż idealne.
Wydaje się, że jest to szara strefa konwencji REST.
api
rest
backbone.js
Donald Taylor
źródło
źródło
Odpowiedzi:
/records/1;2;3
” - więc odpowiedź 2xx na to może spowodować wyczyszczenie pamięci podręcznej/records/1;2;3
; nie czyścić/records/1
,/records/2
lub/records/3
; proxy odpowiedzi 410 dla/records/1;2;3
lub innych rzeczy, które nie mają sensu z twojego punktu widzenia.records=[1,2,3]
to/delete-requests
) i sondowanie utworzonego zasobu (określonego przezLocation
nagłówek odpowiedzi), aby dowiedzieć się, czy żądanie zostało zaakceptowane, odrzucone, czy jest w toku lub zakończył. Jest to przydatne w przypadku długotrwałych operacji. Innym sposobem jest wysłaniePATCH
zapytania do zasobu listy ,/records
, którego treść zawiera listę zasobów i działań do wykonania na tych zasobach (w dowolnym formacie, który chcesz obsługiwać). Jest to przydatne w przypadku szybkich operacji, w których kod odpowiedzi na żądanie może wskazywać wynik operacji.Wszystko można osiągnąć, trzymając się ograniczeń REST, a zwykle odpowiedzią jest przekształcenie „problemu” w zasób i nadanie mu adresu URL.
Tak więc operacje wsadowe, takie jak usuwanie w tym miejscu, wysyłanie wielu elementów do listy lub dokonywanie tej samej edycji zbioru zasobów, mogą być obsługiwane przez utworzenie listy „operacji wsadowych” i przesłanie do niej nowej operacji.
Nie zapominaj, że REST nie jest jedynym sposobem rozwiązania każdego problemu. „REST” to tylko styl architektoniczny i nie musisz się do niego stosować (ale jeśli tego nie zrobisz, stracisz pewne zalety internetu). Proponuję przejrzeć listę architektur HTTP API i wybrać tę, która Ci odpowiada. Po prostu uświadom sobie, na czym tracisz, wybierając inną architekturę, i podejmij świadomą decyzję w oparciu o swój przypadek użycia.
Czy istnieją złe odpowiedzi na to pytanie dotyczące wzorców do obsługi operacji wsadowych w usługach sieci Web REST? które mają o wiele za dużo głosów za, ale też powinny być przeczytane.
źródło
DELETE
żądanie, cokolwiek znajduje się między odbiorcą żądania a serwerem, pomyśli, że pojedynczy zasób pod określonym adresem URL jest usuwany. Ciągi zapytań to nieprzezroczyste części adresu URL do tych urządzeń, więc nie ma znaczenia, w jaki sposób określisz swój interfejs API, nie są one wtajemniczone w tę wiedzę, więc nie mogą zachowywać się inaczej.DELETE
żądaniem jest zabronione. Nie rób tego. Jeśli to zrobisz, zjem twoje dzieci. Nom nom.Jeśli
GET /records?filteringCriteria
zwraca tablicę wszystkich rekordów spełniających kryteria,DELETE /records?filteringCriteria
można usunąć wszystkie takie rekordy.W takim przypadku odpowiedź na twoje pytanie brzmiałaby
DELETE /records?id=1&id=2&id=3
.źródło
GET /records?id=1&id=2&id=3
nie nie znaczy „dostać trzy rekordy z identyfikatorami 1, 2 & 3”, to znaczy „uzyskać pojedynczy zasób URL ścieżki / dokumentacje? id = 1 & id = 2 & id = 3”, który być może jest to obraz rzepa, zwykły tekst dokument zawierający numer „42” w języku chińskim lub może nie istnieć./records?id=1
i/records?id=2
są wysyłane, a ich odpowiedzi są przechowywane w pamięci podręcznej przez jakiegoś pośrednika (np. Twoją przeglądarkę lub dostawcę usług internetowych). Jeśli internet wiedział, co rozumie przez to twoja aplikacja, to ma się rozumieć, że żądanie/records?id=1&id=2
może zostać zwrócone przez pamięć podręczną po prostu przez połączenie (w jakiś sposób) dwóch wyników, które już ma, bez konieczności pytania do serwera pochodzenia. Ale to nie jest możliwe./records?id=1&id=2
może być nieprawidłowy (tylko 1 identyfikator dozwolony na żądanie) lub może zwrócić coś zupełnie innego (rzepa).id[]=1&id[]=2
czyid=1&id=2
w ciągu zapytania do reprezentowania tablicy wartości, ten ciąg zapytania reprezentuje właśnie to. I myślę, że to niezwykle powszechne i dobre praktyki, aby ciąg zapytania reprezentował filtr. Poza tym, jeśli zezwalasz na usuwanie i aktualizacje, nie buforujGET
żądań. Jeśli to zrobisz, klienci będą mieć nieaktualny stan.Myślę, że Mozilla Storage Service SyncStorage API v1.5 to dobry sposób na usunięcie wielu rekordów za pomocą REST.
Usuwa całą kolekcję.
DELETE https://<endpoint-url>/storage/<collection>
Usuwa wiele BSO z kolekcji za pomocą jednego żądania.
DELETE https://<endpoint-url>/storage/<collection>?ids=<ids>
ids : usuwa BSO z kolekcji, których identyfikatory znajdują się na podanej liście oddzielonej przecinkami. Można podać maksymalnie 100 identyfikatorów.
Usuwa BSO w podanej lokalizacji.
DELETE https://<endpoint-url>/storage/<collection>/<id>
http://moz-services-docs.readthedocs.io/en/latest/storage/apis-1.5.html#api-instructions
źródło
Tak, do tej pory trafiłem tylko na jeden przewodnik projektowania interfejsu API REST, który wspomina o operacjach wsadowych (takich jak usuwanie partii): przewodnik projektowania interfejsu API Google .
W tym przewodniku wspomina się o tworzeniu „niestandardowych” metod, które można powiązać za pośrednictwem zasobu za pomocą dwukropka, np
https://service.name/v1/some/resource/name:customVerb
. Wyraźnie wspomina o operacjach wsadowych jako przypadku użycia:Możesz więc wykonać następujące czynności zgodnie z przewodnikiem Google API:
... aby usunąć kilka elementów z zasobów kolekcji.
źródło
If the HTTP verb used for the custom method does not accept an HTTP request body (GET, DELETE), the HTTP configuration of such method must not use the body clause at all,
w rozdziale Custom Method. AleGET accounts.locations.batchGet
API to metoda GET z body. To jest dziwne. developers.google.com/my-business/reference/rest/v4/…POST
używana metoda http i nazwana jest tylko metoda niestandardowabatchGet
. Domyślam się, że Google robi to, aby (a) trzymać się swojej zasady, że wszystkie niestandardowe metody muszą byćPOST
(zobacz moją odpowiedź) i (b) aby ułatwić ludziom umieszczanie „filtru” w treści, abyś nie musiał uciec lub zakodować filtr tak, jak w przypadku ciągów zapytań. minusem jest oczywiście to, że niehttps://service.name/v1/some/resource/name:customVerb
z definicji nie jest RESTful.Pozwoliłem na hurtową wymianę kolekcji, np. Gdy
PUT ~/people/123/shoes
ciało jest reprezentacją całej kolekcji.Działa to w przypadku małych podrzędnych kolekcji elementów, w przypadku których klient chce przejrzeć elementy, a niektóre usunąć i dodać inne, a następnie zaktualizować serwer. Mogliby umieścić pustą kolekcję, aby usunąć wszystkie.
Oznaczałoby to,
GET ~/people/123/shoes/9
że nadal pozostawałby w pamięci podręcznej, mimo że PUT usunął go, ale jest to tylko problem z pamięcią podręczną i byłby problemem, gdyby inna osoba usunęła but.Moje interfejsy API danych / systemów zawsze używają znaczników ETag, a nie czasów wygaśnięcia, więc serwer jest trafiany przy każdym żądaniu i wymagam poprawnych nagłówków wersji / współbieżności, aby zmutować dane. W przypadku interfejsów API, które są tylko do odczytu i dostosowane do wyświetlania / raportowania, używam czasów wygaśnięcia, aby zmniejszyć trafienia w źródle, np. Tabela wyników może być dobra przez 10 minut.
W przypadku znacznie większych kolekcji, takich jak
~/people
, zwykle nie potrzebuję wielokrotnego usuwania, przypadek użycia nie pojawia się naturalnie, więc pojedyncze DELETE działa dobrze.W przyszłości, z doświadczenia w budowaniu REST API i trafianiu na te same problemy i wymagania, takie jak audyt, byłbym skłonny używać tylko czasowników GET i POST oraz projektować wokół zdarzeń, np. POST zmiana adresu zdarzenia, chociaż podejrzewam, że Pojawi się z własnym zestawem problemów :)
Pozwoliłbym również programistom front-end na tworzenie własnych interfejsów API, które używają bardziej rygorystycznych interfejsów API zaplecza, ponieważ często istnieją praktyczne, ważne powody po stronie klienta, dla których nie lubią surowych projektów interfejsu API REST „zelotów Fielding”, a także ze względu na produktywność i przyczyny warstw pamięci podręcznej.
źródło