2014-10-15 21 views
5

Jeśli używam UUID zidentyfikować podmiot jako część mojego URI mego odpoczynku punkt końcowy:REST PUT vs POST z UUID

/entities/<uuid>/ 

i że UUID jest generowany przez klienta przy tworzeniu nowych podmiotów jest istnieje najlepsza praktyka w zakresie używania PUT vs POST? Innymi słowy, UUID jest generowany przez klienta, a nie przez serwer.

Jeśli miałbym używać PUT, czy oczekuje się, że treść wiadomości zawiera także UUID? W takim przypadku zarówno wiadomość, jak i identyfikator URI identyfikujący jednostkę, będą zawierały UUID.

Dla specyfikacji, patrz: REST RFC

+1

Dezorientujesz "REST" za pomocą "HTTP". Nie ma "REST RFC". Istnieje "HTTP RFC", ale obecnie nie jest to już RFC 2616. –

Odpowiedz

3

Ponieważ (klient) już wiedzą UUID, powiedziałbym PUT jest najlepsza praktyka, a nie muszą zawierać UUID w ładunku. Prawdą jest, że PUT vs POST jest nieco kontrowersyjne, a czytanie i ponowne czytanie RFC nie całkowicie to wyjaśnia. Ale myślę, że poprzednim jest ortodoksja.

Zobacz fajną dyskusję na stronie PUT vs POST in REST.

+0

Czy to prawda, że ​​"nie musisz podawać UUID w polu danych"? To wydaje się sprzeczne z tym, co powiedział @nikita o konieczności uwzględnienia UUID, ponieważ jest częścią reprezentacji zasobu. –

+0

Nazwa zasobu nie musi być częścią reprezentacji. –

0

Główną różnicą między POST i PUT:

POST służy do dołączania nowych podmiotów. POST to nie idempotent. Oznacza to, że jeśli wysyłasz żądanie POST dziesięć razy, utworzysz dziesięć różnych podmiotów. Zwykle powinieneś otrzymać kod odpowiedzi 201 (Utworzony) na żądanie POST w połączeniu z nagłówkiem Lokalizacja wskazujący adres URL nowo utworzonego zasobu. W twoim przypadku proponuję opublikować URL sthm jak

POST /entities/ HTTP/1.1 
Content-Type: application/json 
{ 
    UUID: <UUID>.. 
    OtherStuff: ... 
} 

Response:

HTTP/1.1 201 Created 
Location: http://www.myREST/entities/<uuid>/ 

PUT żądanie służy do modyfikowania istniejącego stanu. PUT to idempotent. Zwykle otrzymasz kod odpowiedzi 200 (OK).

Musisz podać UUID w polu danych PUT/POST. UUID jest częścią reprezentacji Twojego zasobu. PUT i POST obie reprezentacje przesyłania do serwera REST w celu zmiany/dołączenia stanu zasobów.

BTW nie powinieneś używać terminu URI w REST. Identyfikator URI to sthm, który może nie mieć reprezentacji, ale URL zawsze ma reprezentację.

+0

Jeśli mam ograniczenie unikalności dla UUID, to coś zmienia. (Zasadniczo jest to konieczne, ponieważ polegam na tym, że UUID może być kanonicznym odnośnikiem dla encji)? Więc jeśli próbuję POST wielokrotnie ten sam UUID, tylko pierwszy jest pomyślnie 201. Powinienem być zainteresowany/dbać, że gdybym użył PUT do utworzenia, ja określam dane w tym, że URL i ładunek zawierają zarówno (mam nadzieję) ten sam UUID? –

+0

1. W twoim przypadku (SINCE generujesz UUID na kliencie) kolejne testy POST powinny odpowiadać 409 (Conflict). W każdym razie powinieneś uwzględnić UUID w POST, ponieważ serwer powinien wskazać ci zasoby, które utworzył dla klienta. Tworzy go przy użyciu UUID tego klienta. To najlepsza praktyka. Jest to sposób, w jaki klient i serwer komunikują się nawzajem - przekazując reprezentacje tam iz powrotem. – nikita

+0

Czy masz na myśli, że powinieneś dołączyć UUID do 'PUT'? prawdopodobnie trzeba to uwzględnić w POST, ponieważ adres URL nie zawiera identyfikatora UUID. –

1

Zrozumieć różnicę między PUT i POST.

PUT ma na celu zastąpienie zasobu (http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.6) wskazywanego przez identyfikator URI nowym. I jest to idempotentne, tzn. Ile razy wywołasz go z taką samą ładownością, wynik jest taki sam; udostępni ten sam zasób za pośrednictwem URI.

Tak więc, jeśli zasób już nie istnieje, zostanie utworzony nowy. Nawet w tym przypadku wynik jest taki sam, tzn. Udostępni ten sam zasób za pośrednictwem URI.

POST oznacza utworzenie pod-zasobu (http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.5) do zasobu wskazywanego przez URI.Jeśli zasób jest listą, to doda element do niego. Jeśli jest to przedmiot, powinien dodać coś do przedmiotu, może to być atrybut.

Najlepiej jeśli element wskazywany przez identyfikator URI jest niedostępny, powinien to być warunek błędu. Może być "404". POST polega na dodawaniu do istniejącego zasobu.

Wychodząc z pytaniem, najlepiej użyć testu POST z "/ entity /" jako identyfikatorem URI, jak w powyższym opisie. Nie powinieneś używać nieistniejącego identyfikatora UUID zasobu w URI z metodą POST. Jeśli używasz PUT, użyj "/ entity /".

POST /entities/ HTTP/1.1 
Content-Type: application/json 
{ 
    UUID: <UUID>.. 
    OtherStuff: ... 
} 

PUT /entities/<UUID> HTTP/1.1 
Content-Type: application/json 
{ 
    UUID: <UUID>.. 
    OtherStuff: ... 
} 

reakcji powinien być taki sam

HTTP/1.1 201 Created 
Location: http://www.examples.com/entities/<uuid>/ 

chociaż sprzedaży jest idempotent ale jeśli metoda sprzedaży jest ponownie użyty, należy używać 200 lub 204 w odpowiedzi.

Twoje drugie pytanie: najlepiej pełny szczegół zasobów powinien znajdować się w polu danych PUT zamiast tylko URI.

+0

Przedstawiłeś dwa sposoby tworzenia nowego zasobu: 'POST' bez UUID i' PUT' z UUID. Który z nich jest preferowany w tym przypadku, gdy identyfikator UUID jest generowany po stronie klienta? –

+0

Wolę POST bez UUID, aby utworzyć nowy zasób. Ponieważ zachowałem to w ten sposób, że URI powinien zawsze wskazywać na istniejący zasób. W ten sposób nie jestem zdezorientowany. Także aby PUT naprawdę idempotent powrócił zawsze z tą samą odpowiedzią, jeśli ładunek jest taki sam. Ale jeśli utworzysz nowy zasób z PUT, a także zaktualizujesz z PUT, zwróci on dwa różne typy odpowiedzi. W utworze jest 201, w przeciwnym razie wynosi 200. Łamie to semantykę. – Jangid

Powiązane problemy