2013-08-14 15 views
6

Mam zasób, który można uzyskać pod adresem URI /resources/{resource_identifier} i ma właściwość "status", która ma być dostępna. Zastanowiłem się nad kilkoma opcjami, które byłyby "najlepsze" lub "najbardziej relaksujące"?Reszta projektu uri do zmiany statusu zasobu

działania Option One Append na URI i mieć klienta POST tych URI

/resources/{resource_identifier}/void  
/resources/{resource_identifier}/open  
/resources/{resource_identifier}/close 

To wygląda niezdarny choć.


Opcja druga Użyj param kwerendy w URI, a nie klienta PATCH do tych

/resources/{resource_identifier}?transition=void 
/resources/{resource_identifier}?transition=open 
/resources/{resource_identifier}?transition=close 

Opcji Trzy Korzystanie ładunek na życzenie i mieć klienta PUT

/resources/{resource_identifier} 

opcji ładowność:

{ ..., "status" :"void" } 
{ ..., "status" :"open" } 
{ ..., "status" :"close" } 

A może coś zupełnie innego?

Odpowiedz

1

Twoja druga opcja wygląda lepiej, ponieważ zachowujesz strukturę URL RESTful i nie dołączasz do niej metod w stylu RPC.

Dlaczego nie po prostu to zrobić:

PUT do /resources/:id i wysyłać dane transition=void z żądaniem.

Zachowuje się w taki sam sposób, jak w przypadku otrzymywania żądania POST, wystarczy pobrać dane z treści żądania.

+0

Dzięki ... Ale tworzymy tworzenie zasobów i akcje na żądanie * POST *. Tylko do aktualizacji używamy żądania * PUT * ... Jeszcze raz dziękuję. – Suresh

7

Dlaczego nie "status" jako zasób. Możesz nim zarządzać. Załóżmy również, że powinien istnieć "status" utworzony w ramach tworzenia zasobów {resource_identifier} i istnieje już domyślna wartość dla statusu.

Następnie logika biznesowa polega jedynie na "zaktualizowaniu" statusu poprzez pozostałe połączenia i dlatego należy użyć "PUT".

aktualizowane Moving statusu do Put-Body

PUT: /resources/{resource_identifier}/status/ 

Body: {void | open | close } 
+1

Myślę, że PUTing do/status/resource ma sens. Czy nie określiłbyś rzeczywistego statusu: nieważne, otwarte, zamknięte w ciele PUT, a nie jako część URI? –

+0

Tak, to powinno być dobre. –

11

Pierwsza opcja nie jest wyraźnie odpoczynku; masz "działania" w URI i używasz POST, co ma na celu utworzenie nowego zasobu, którego najwyraźniej nie próbujesz zrobić.

Patrząc na format tylko URI na teraz. Opcja druga jest coraz lepsza, ale ciągi zapytań tego typu są bardziej dla danych odczytujących dane. Nic tak naprawdę nie powstrzymuje cię od zrobienia tego w ten sposób. Opcja trzecia ma najlepszy format URI, odwołuje się tylko do tego, do którego zasobu chcesz się odwołać.

Jeśli teraz rozważymy metodę żądania. W mojej książce jest to dość proste, zakładam, że status jest tylko jednym polem tego zasobu, więc jeśli wykonujesz tylko częściową aktualizację, łatasz zasób, a tym samym jest to metoda, której należy użyć. Przy braku szansy "stan" jest jedyną właściwością, a następnie zmiana statusu całkowicie zmienia zasób, a zatem PUT byłaby dopuszczalna; ale wątpię, czy tak rzeczywiście jest.

W obecnej postaci identyfikatory URI trzeciej opcji w połączeniu z użyciem PATCH są prawdopodobnie najlepszą opcją.

PATCH /resources/{resource_identifier} 

{ "status" :"close" } 

Oczywiście, można także łączyć z tym pojęciem narażając konkretnych atrybutów poprzez własny URI, jak gdyby były zasobem w sobie. Szczerze mówiąc, nie podoba mi się to, ponieważ wydaje się dziwne i działa tylko dla jednego atrybutu na raz. Mimo to, jeśli to jest to, czego chciał użyć, można mieć coś takiego:

PUT /resources/{resource_identifier}/status 

close 

Pamiętaj, że nie ma „prawo” sposób prowadzenia odpocząć, po prostu „nie złe” sposoby. To styl, a nie zbiór reguł.

Sugeruję również, że uważacie, że umiejętność przyjmowania wielu formatów jest ogólnie pożądaną cechą. W związku z tym pierwsza opcja wydaje się łatwiejsza w obsłudze. Możesz wziąć JSON, jak w przykładzie, lub zamienić go na XML <status>close</ status>, lub prostą parę wartości klucza status=closed itd.

+0

A jeśli chcesz użyć hipermedii? Opcja pierwsza może być bardziej odpowiednia niż właściwa? Aby te zasoby były wyświetlane tylko w stosownych przypadkach (http://stackoverflow.com/questions/39457627/hateoas-and-links-actions/39459974?noredirect=1#comment66244134_39459974). Co myślisz? – adnan

+0

Szczerze mówiąc, nie bardzo rozumiem, o co pytasz. To pytanie dotyczy projektu ReSTfull, w którym to przypadku użycie akcji jako części adresu URL jest wyraźnie sprzeczne z tym, co było zalecane przez Fielding, a jeśli nie opierasz swojego projektu na decyzjach dotyczących tego, co Fielding zalecał w swojej gazecie, to nie jesteś na temat ReST, a więc wszystko jest dyskusyjne. – thecoshman

+0

Dlaczego nie, tworząc listę różnych odpowiednich działań, którymi kierujesz użytkownika, do których zmiany stanów są dostępne (HATEOAS prawy?). Dlaczego to nie jest ReSTfull? – adnan

Powiązane problemy