2013-05-08 15 views
7

Projektuję prosty interfejs API CRUD REST. To jest mój pierwszy raz, więc chciałem uzyskać informacje zwrotne na temat tego, czy mój projekt ma sens.Jak zaprojektować prosty interfejs API CRUD REST

Używam metod HTTP: GET, POST, DELETE i UPDATE. Interfejs API pobierze i pobierze dane w formacie JSON. Próbka URL będzie taki jak ten:

GET (list): curl http://<domain>/myapp/rest/v1/colors 
POST: curl -XPOST http://<domain>/myapp/rest/v1/colors -d '{ 
     "name": "red", 
     "shade": "light" 
     }' 
GET (single item): curl http://<domain>/myapp/rest/v1/colors/2 
DELETE: curl -XDELETE http://<domain>/myapp/rest/v1/colors/2 
etc... 

Pytanie

Po żądania POST rekord zostanie utworzony w bazie danych. Zatem, czy żądanie POST powinno zwrócić identyfikator nowo utworzonego rekordu? Czy ten identyfikator może być użyty w UPDATE, DELETE and GET (single item)?

+0

Zależy od tego, jak zaprojektowałeś swój serwis wypoczynkowy. Tak, żądanie POST może otrzymać treść odpowiedzi. – Joshi

+0

Dzięki, tak, rozumiem, że POST może otrzymać ciało. Ale czy mogę wysłać odpowiedź po przetworzeniu żądania i powiedzieć, na przykład, że nowo utworzony rekord ma identyfikator "659" – birdy

+0

Tak, możesz użyć tych identyfikatorów, jeśli są one zsynchronizowane z twoją bazą danych. – Joshi

Odpowiedz

5

HTTP specification określa następujące POST:

Jeśli zasób została utworzona na serwerze pochodzenia, odpowiedź powinna być 201 (Utworzono) i zawierać podmiot, który opisuje status wniosku i odnosi do nowego zasobu oraz nagłówek Location (patrz: pkt 14.30).

Więc to w zasadzie oznacza:

  • Należy zwrócić 201 Created jako kod statusu
  • Należy zwrócić Location głową, wskazując na URI nowo utworzonego zasobu
  • Można ewentualnie zawierać reprezentacja zasobu w treści odpowiedzi POST w celu zwolnienia klienta z konieczności wystawienia kolejnego żądania GET na wartość uzyskaną z nagłówka Location.
+0

. więc ten trzeci punkt oznacza, że ​​mogę po prostu zwrócić nowo utworzony ID – birdy

+4

. Po pierwsze, URI * to * identyfikator (stąd nazwa). Po drugie, napisałem "reprezentację zasobu", co oznacza, że ​​jest to zasadniczo to samo, co otrzymałeś, jeśli podążyłeś za odnośnikiem w nagłówku "Lokalizacja", przeczytaj: JSON, który pierwotnie wysłałeś w swojej sprawie. –

1

POST powinien zwrócić przekierowanie do nowego adresu URL dla pojedynczej pozycji.

Prawdopodobnie chcesz utracić identyfikator wersji adresów URL.

Zamiast tego zaprojektuj swoje reprezentacje i klientów w taki sposób, aby z wdziękiem obsługiwać różne wersje. Na przykład klient nie powinien polegać na określonym formacie, ale tylko na atrybutach, których potrzebuje.

To, czego brakuje w twoim opisie, to zasada HATEOAS, to znaczy, że klient nie powinien twardo kodować żadnych adresów URL, ale znajdować adresy URL dla dalszych działań wewnątrz reprezentacji innych podmiotów. Ponieważ nie wyświetlasz przykładowego dokumentu dla wyników zwróconych przez adresy URL, nie możemy powiedzieć, czy zrobiłeś to w miły sposób.

Zapoznaj się z this presentation, wyjaśnia temat, a także wspomina o Bibliotece Wiosennej przydatnej do jej realizacji.

+0

Dzięki, nie byłem świadomy zasady HATEOAS.przy okazji, chociaż brakuje tagów, używam grailsów, aby to osiągnąć. Dodam tag. Dlatego zamiast zwracać tylko identyfikator, post powinien zwrócić pełny adres URL pojedynczego elementu, tj. "Http: // /myapp/rest/v1/colors/2" – birdy

Powiązane problemy