R w REST oznacza zasób
(Co nie jest prawdą, ponieważ oznacza Reprezentację, ale dobrym pomysłem jest zapamiętanie znaczenia zasobów w REST).
Informacje PUT /groups/api/v1/groups/{group id}/status/activate
: nie aktualizujesz „aktywuj”. „Aktywacja” nie jest rzeczą, to czasownik. Czasowniki nigdy nie są dobrymi zasobami. Ogólna zasada: jeśli akcja, czasownik, znajduje się w adresie URL, prawdopodobnie nie jest to RESTful .
Co zamiast tego robisz? Albo „dodajesz”, „usuwasz” lub „aktualizujesz” aktywację w grupie, albo jeśli wolisz: manipulujesz zasobem „statusowym” w grupie. Osobiście użyłbym „aktywacji”, ponieważ są one mniej dwuznaczne niż pojęcie „status”: tworzenie statusu jest niejednoznaczne, tworzenie aktywacji nie jest.
POST /groups/{group id}/activation
Tworzy (lub prosi o utworzenie) aktywacji.
PATCH /groups/{group id}/activation
Aktualizuje niektóre szczegóły istniejącej aktywacji. Ponieważ grupa ma tylko jedną aktywację, wiemy, do jakiego zasobu aktywacyjnego mamy na myśli.
PUT /groups/{group id}/activation
Wstawia lub zastępuje starą aktywację. Ponieważ grupa ma tylko jedną aktywację, wiemy, do jakiego zasobu aktywacyjnego mamy na myśli.
DELETE /groups/{group id}/activation
Anuluje lub usunie aktywację.
Ten wzór jest przydatny, gdy „aktywacja” grupy ma skutki uboczne, takie jak dokonywanie płatności, wysyłanie wiadomości e-mail i tak dalej. Tylko POST i PATCH mogą mieć takie skutki uboczne. Gdy np. Usunięcie aktywacji wymaga, powiedzmy, powiadomienia użytkowników pocztą, DELETE nie jest właściwym wyborem; w takim przypadku prawdopodobnie chcesz utworzyć zasób dezaktywacji : POST /groups/{group_id}/deactivation
.
Dobrym pomysłem jest przestrzeganie tych wytycznych, ponieważ ta standardowa umowa wyraźnie pokazuje klientom, a wszystkie proxy i warstwy między klientem a tobą wiedzą, kiedy można bezpiecznie ponowić próbę, a kiedy nie. Powiedzmy, że klient jest gdzieś z niestabilnym Wi-Fi, a jego użytkownik klika „dezaktywuj”, co powoduje DELETE
: Jeśli to się nie powiedzie, klient może po prostu spróbować ponownie, aż otrzyma 404, 200 lub cokolwiek innego, co może obsłużyć. Ale jeśli uruchomi się POST to deactivation
, wie, że nie można ponowić: POST implikuje to.
Każdy klient ma teraz umowę, której przestrzeganie ochroni przed wysłaniem 42 e-maili „Twoja grupa została zdezaktywowana”, po prostu dlatego, że jej biblioteka HTTP ponawiała połączenie z backendem.
Aktualizowanie pojedynczego atrybutu: użyj PATCH
PATCH /groups/{group id}
W przypadku, gdy chcesz zaktualizować atrybut. Np. „Status” może być atrybutem w Grupach, które można ustawić. Atrybut taki jak „status” jest często dobrym kandydatem do ograniczenia do białej listy wartości. Przykłady wykorzystują niezdefiniowany schemat JSON:
PATCH /groups/{group id} { "attributes": { "status": "active" } }
response: 200 OK
PATCH /groups/{group id} { "attributes": { "status": "deleted" } }
response: 406 Not Acceptable
Zastępując zasób bez efektów ubocznych użyj PUT.
PUT /groups/{group id}
Jeśli chcesz zastąpić całą Grupę. Nie musi to koniecznie oznaczać, że serwer faktycznie tworzy nową grupę i wyrzuca starą, np. Identyfikatory mogą pozostać takie same. Ale dla klientów to właśnie może oznaczać PUT : klient powinien założyć, że otrzymuje zupełnie nowy przedmiot, w oparciu o odpowiedź serwera.
W przypadku PUT
żądania klient powinien zawsze wysyłać cały zasób, mając wszystkie dane potrzebne do utworzenia nowego elementu: zwykle te same dane, których wymagałoby utworzenie POST.
PUT /groups/{group id} { "attributes": { "status": "active" } }
response: 406 Not Acceptable
PUT /groups/{group id} { "attributes": { "name": .... etc. "status": "active" } }
response: 201 Created or 200 OK, depending on whether we made a new one.
Bardzo ważnym wymogiem jest PUT
idempotent: jeśli potrzebujesz efektów ubocznych podczas aktualizacji Grupy (lub zmiany aktywacji), powinieneś użyć PATCH
. Jeśli więc aktualizacja spowoduje np. Wysłanie wiadomości e-mail, nie należy jej używać PUT
.