2012-04-23 26 views
13

Czytałem artykuły o usługach RESTful przez jakiś czas i rozumiem znaczenie używania VERBS przeciwko ZASOBAMI.Niestandardowe działanie w usłudze RESTful

Ale jest jedna rzecz, której nie rozumiem. Co się stanie, jeśli będziemy musieli wywołać określone działanie, które nie jest częścią CRUD?

Weźmy na przykład pod uwagę, że chcę zrobić skok z kotem. Z jakiego formatu powinniśmy skorzystać?

Czy poniższe czynności są RESTOWNOWE?

http://host/cats/123/jump 

Odpowiedz

9

Jeśli cats/123 reprezentuje zasób potem myśleć o tym w ten sposób: że zasób może mieć wiele stany (jedzenie, chodzenie, spanie, skoki, pissing, ...). Podczas projektowania interfejsu API za pomocą stylu architektonicznego REST użytkownik chce zezwolić aplikacji klienta na przekazywanie dopuszczalnych żądań do zasobu, który zmieni jego stan.

W kontekście cats/123 można to zrobić za pomocą serii żądań POST, które spowodują zmianę stanu zasobu. Korzystając z możliwości hipermedialnych w REST, można utworzyć proces, taki jak żądania i odpowiedzi przedstawione poniżej. Zauważ, że dopuszczalne linki zmieniają się w odpowiedzi na POST. Ponadto aplikacja kliencka będzie kodować do właściwości zawartych w tablicy Links, a nie do rzeczywistego identyfikatora URI zawartego we właściwościach Href.

Zapytanie:

GET cats/123 

Response:

{ 
    "Color" : "black", 
    "Age" : "2", 
    "Links":[ 
    { 
     "Food":"kibbles", 
     "Method":"POST", 
     "Href":"http://cats/123", 
     "Title":"Feed the cat" 
    }, 
    { 
     "Scare":"yell real loud", 
     "Method":"POST", 
     "Href":"http://cats/123", 
     "Title":"Scare the cat" 
    }] 
} 

Zapytanie:

POST cats/123 

{ 
    "Food":"kibbles" 
} 

Response:

{ 
    "Color" : "black", 
    "Age" : "2", 
    "Tummy" : "full" 
    "Links":[ 
    { 
     "Sleep":"lap", 
     "Method":"POST", 
     "Href":"http://cats/123", 
     "Title":"Pet the cat" 
    }, 
    { 
     "Scare":"yell real loud", 
     "Method":"POST", 
     "Href":"http://cats/123", 
     "Title":"Scare the cat" 
    }] 
} 
+1

+1. Dzięki. Ale pomyślałem, że powinniśmy użyć PUT zamiast POST do aktualizacji zasobu? Czytałem, że POST powinien być użyty do stworzenia? – SiN

+0

Niestety, dyskusje ("argumenty") dotyczące stylu architektonicznego REST opierają się na zrozumieniu specyfikacji HTTP i zawartych w niej definicji. W skrócie, [specyfikacja HTTP] (http://www.ietf.org/rfc/rfc2616.txt) mówi, że metoda PUT jest sposobem wysyłania * całej * reprezentacji zasobów (jednostka aktualizowana przez klienta) do serwer, aby mógł zastąpić bieżącą reprezentację zasobu, zakładając, że klient miał najnowszą wersję. W pytaniu "akcja" żąda zmiany stanu zamiast hurtowego zastąpienia zasobu zaktualizowaną wersją. –

+0

{Zabrakło miejsca :) :) Ponadto, POST jest akceptowanym sposobem powodowania przejścia reprezentacji zasobów z jednego stanu do drugiego. –

Powiązane problemy