Operacje niezwiązane z CRUD w służbie RESTful

Jaki jest "RESTful" sposób dodawania operacji innych niż CRUD do usługi RESTful? Powiedzmy, że mam usługę, która umożliwia CRUD dostęp do takich rekordów:

GET /api/car/123           <- Returns information for the Car object with ID 123
POST /api/car              <- Creates a new car (with properties in the request)
PUT /api/car/123           <- Updates car 123 (with properties in the request)
DELETE /api/car/123        <- Deletes car 123    
POST /api/car/123/wheel/   <- Creates a wheel and associates it to car 123

Jeśli chcę zmienić kolor samochodu, po prostu POST /api/car/123 i dołącz zmienną POST dla nowego koloru.

Ale powiedzmy, że chcę kupić samochód, A Ta operacja jest bardziej skomplikowana niż po prostu aktualizacja "własności samochodu" "użytkownika". Czy można po prostu zrobić coś takiego jak POST /api/car/123/purchase, gdzie "zakup" jest zasadniczo nazwa metody? Czy powinienem użyć niestandardowego czasownika HTTP, jak PURCHASE zamiast POST?

Czy operacje bez CRUD są całkowicie poza zakresem odpoczynku?

Author: MikeWyatt, 2011-07-27

4 answers

Pomyśl o zakupie jako podmiotu gospodarczego lub zasobu w słowniku RESTful. Biorąc to pod uwagę, dokonywanie zakupu jest w rzeczywistości tworzeniem nowego zasobu. Więc:

POST /api/purchase

Złoży nowe zamówienie. Szczegóły (użytkownik, samochód, itp.) powinny być odwołane przez id (lub URI) wewnątrz treści wysyłanej na ten adres.

Nie ma znaczenia, że zamówienie samochodu to nie tylko zwykła wstawka do bazy danych. W rzeczywistości REST nie polega na ujawnianiu tabel bazy danych jako CRUD szef. Z logicznego punktu widzenia tworzysz zamówienie( zakup), ale strona serwera może wykonać tyle kroków przetwarzania, ile chce.

Możesz nawet nadużywać protokołu HTTP jeszcze bardziej. Użyj nagłówka Location, aby zwrócić link do nowo utworzonego zamówienia, starannie wybierz kody odpowiedzi HTTP, aby poinformować użytkowników o problemach (po stronie serwera lub klienta), itp.

 59
Author: Tomasz Nurkiewicz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-10 18:11:44

Spokojny sposób, jak rozumiem, jest to, że nie potrzebujesz nowych czasowników HTTP, jest gdzieś rzeczownik, który będzie oznaczać to, co musisz zrobić.

Kupić samochód? Czy to nie jest

POST /api/order
 14
Author: djna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-27 20:11:49

To, co naprawdę robisz, to tworzenie zamówienia. Więc dodaj kolejny zasób do zamówienia i opublikuj i umieść tam podczas procesu zamówienia.

Myśl w kategoriach zasobów, a nie wywołań metod.

Aby sfinalizować zamówienie, prawdopodobnie zamieścisz /api / order / / complete lub coś podobnego.

 5
Author: Andrew Kothmann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-27 19:40:36

Czuję, że API REST pomagają na wiele więcej sposobów niż tylko dostarczanie semantyki. Więc nie można wybrać stylu RPC tylko z powodu niektórych wywołań, które wydają się mieć większy sens w stylu działania RPC. Przykładem jest Google maps api, aby znaleźć wskazówki między dwoma miejscami. Wygląda tak: http://maps.googleapis.com/maps/api/directions/json?origin=Jakkur&destination=Hebbal

Mogli nazwać to "findDirections" (czasownik) i traktować to jako operację. Raczej uczynili " kierunek "(rzeczownik) jako zasób i traktowane znalezienie kierunków jako zapytanie na zasób Kierunki (choć wewnętrznie nie może być prawdziwy zasób o nazwie kierunek i może być realizowane przez logikę biznesową, aby znaleźć kierunki na podstawie params).

 3
Author: Maruthi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-19 12:02:29