Myślę, że możesz użyć metody POST lub PATCH, aby sobie z tym poradzić, ponieważ zazwyczaj projektują do tego.
Użycie POSTmetody jest zwykle używane do dodawania elementu, gdy jest używane w zasobie listy, ale można również obsługiwać kilka akcji dla tej metody. Zobacz tę odpowiedź: Jak zaktualizować zbiór zasobów REST . Możesz także obsługiwać różne formaty reprezentacji danych wejściowych (jeśli odpowiadają one tablicy lub pojedynczym elementom).
W takim przypadku nie jest konieczne definiowanie formatu, aby opisać aktualizację.
Użycie PATCHmetody jest również odpowiednie, ponieważ odpowiednie żądania odpowiadają częściowej aktualizacji. Według RFC5789 ( http://tools.ietf.org/html/rfc5789 ):
Kilka aplikacji rozszerzających protokół Hypertext Transfer Protocol (HTTP) wymaga funkcji częściowej modyfikacji zasobów. Istniejąca metoda HTTP PUT umożliwia tylko całkowitą wymianę dokumentu. Ta propozycja dodaje nową metodę HTTP, PATCH, w celu zmodyfikowania istniejącego zasobu HTTP.
W takim przypadku musisz zdefiniować swój format, aby opisać częściową aktualizację.
Myślę, że w tym przypadku POSTi PATCHsą dość podobne, ponieważ tak naprawdę nie musisz opisywać operacji do wykonania dla każdego elementu. Powiedziałbym, że zależy to od formatu przesłanego oświadczenia.
Sprawa PUTjest nieco mniej jasna. W rzeczywistości, używając metody PUT, powinieneś podać całą listę. W rzeczywistości reprezentacja przedstawiona w żądaniu będzie zastępować reprezentację zasobu listy.
Możesz mieć dwie opcje dotyczące ścieżek zasobów.
- Korzystanie ze ścieżki zasobów dla listy dokumentów
W takim przypadku musisz wyraźnie podać link do dokumentów z segregatorem w reprezentacji podanej w żądaniu.
Oto przykładowa trasa do tego /docs.
Treść takiego podejścia może dotyczyć metody POST:
[
{ "doc_number": 1, "binder": 4, (other fields in the case of creation) },
{ "doc_number": 2, "binder": 4, (other fields in the case of creation) },
{ "doc_number": 3, "binder": 5, (other fields in the case of creation) },
(...)
]
- Używanie ścieżki zasobu podrzędnego elementu binder
Ponadto można również rozważyć wykorzystanie tras podrzędnych do opisu powiązania między dokumentami a segregatorami. Wskazówki dotyczące powiązania między dokumentem a segregatorem nie muszą być teraz określane w treści żądania.
Oto przykładowa trasa do tego /binder/{binderId}/docs. W takim przypadku wysyłanie listy dokumentów metodą POSTlub PATCHdołączanie dokumentów do segregatora z identyfikatorem binderIdpo utworzeniu dokumentu, jeśli nie istnieje.
Treść takiego podejścia może dotyczyć metody POST:
[
{ "doc_number": 1, (other fields in the case of creation) },
{ "doc_number": 2, (other fields in the case of creation) },
{ "doc_number": 3, (other fields in the case of creation) },
(...)
]
Jeśli chodzi o odpowiedź, to do Ciebie należy określenie poziomu odpowiedzi i błędów do zwrócenia. Widzę dwa poziomy: poziom statusu (poziom globalny) i poziom ładunku (poziom cieńszy). Do Ciebie należy również określenie, czy wszystkie wstawki / aktualizacje odpowiadające Twojemu żądaniu muszą być atomowe, czy nie.
W takim przypadku możesz wykorzystać stan HTTP. Jeśli wszystko pójdzie dobrze, otrzymasz status 200. Jeśli nie, inny status, na przykład 400jeśli podane dane nie są poprawne (na przykład identyfikator segregatora jest nieprawidłowy) lub coś innego.
W takim przypadku 200zostanie zwrócony status i do reprezentacji odpowiedzi należy opisanie, co zostało zrobione i gdzie ostatecznie wystąpiły błędy. ElasticSearch ma punkt końcowy w swoim interfejsie API REST do zbiorczej aktualizacji. To może dać ci kilka pomysłów na tym poziomie: http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/bulk.html .
Możesz również zaimplementować przetwarzanie asynchroniczne w celu obsługi dostarczonych danych. W takim przypadku zwracany stan HTTP będzie 202. Klient musi pobrać dodatkowe zasoby, aby zobaczyć, co się stanie.
Zanim skończę, chciałbym również zauważyć, że specyfikacja OData rozwiązuje problem dotyczący relacji między jednostkami z funkcją o nazwie linki nawigacyjne . Może mógłbyś rzucić okiem na to ;-)
Poniższy link może Ci również pomóc: https://templth.wordpress.com/2014/12/15/designing-a-web-api/ .
Mam nadzieję, że ci to pomoże, Thierry
GET /docsi pobrać wszystkie dokumenty w szczególności spoiwaGET /docs?binder_id=x. Aby usunąć podzbiór zasobów,DELETE /docs?binder_id=xczy powinienem wywołać, czy powinienem wywołaćDELETE /docsz{"binder_id": x}w treści żądania? Czy kiedykolwiekPATCH /docs?binder_id=xużywałbyś aktualizacji zbiorczej, czy po prostuPATCH /docsi przepuszczał pary?