2012-02-13 12 views
30

Czytałem kilka dokumentów na temat właściwego korzystania z URI przy użyciu usług odpoczynku i natknąłem się na przykład dla podstawowych żądań GET .. DELETE.W tym identyfikator w URI dla żądań PUT

Przykładowe uri byli:

Uzyskaj wszystkich użytkowników

GET http://mydomain.org/api/users 

Get konkretnego użytkownika

GET http://mydomain.org/api/users/1 

Aktualizacja użytkownik

PUT http://mydomain.org/api/users/1 

usunąć użytkownika

DELETE http://mydomain.org/api/users/1 

Zasób użytkownik będzie albo JSON lub XML w postaci:

{ 
    Id: 1, 
    FirstName: 'John', 
    LastName: 'Doe' 
} 

Moje pytanie jest takie. Aby zachować zasady REST, czy należy podać identyfikator zasobu w URI dla żądań PUT?

Odpowiedz

33

Metoda PUT żąda, aby zamknięty obiekt był przechowywany w dostarczonym URI żądania.

Chcesz PUT zasób do tego samego identyfikatora URI, który chcesz GET go od.

RFC 2616 9.6 PUT

+0

To ma sens. Zakładałem, że identyfikator zawsze będzie dostarczany z zasobem, ale myślę, że nie zawsze tak będzie. –

+1

Rzeczywiście, jeśli zaczniesz używać URI w swoim interfejsie, możesz szybko uznać za przydatne usunięcie identyfikatora z samej reprezentacji zasobów. – fumanchu

+2

RFC-2616 jest przestarzały przez [RFC-7231] (https://tools.ietf.org/html/rfc7231#section-4.3) – prasanthv

13

miałem zamiar zadać podobne pytanie, ale myślę, że znalazłem odpowiedź. Nie jestem pewien, czy jest to zgodne z zasadami REST, ale właśnie dlatego byłoby źle nie uwzględniać identyfikatora w URI. Tak mówią Twój PUT jest jak:

PUT http://mydomain.org/api/users 

I wtedy stało się zaktualizowanie wielu użytkowników o różnych id, ale samego URI przyczyna nie ma ID w URI. Następnie ważną rzeczą, o której warto wiedzieć, jest to, że PUT jest idempotentem http verb. Oznacza to, że wywoływanie go raz powinno mieć taki sam efekt, jak nazywanie go kilkoma razy. Dlatego niektóre węzły pośrednie w sieci, następujące po tym, że PUT wielokrotnie, mogą zignorować wszystkie z wyjątkiem jednego z żądań, ponieważ mają ten sam identyfikator URI. Wreszcie, to zdecydowanie nie jest to, co chcesz, ponieważ intencją było zaktualizować wielu użytkowników, nie tylko jeden.

+2

Wątpię, czy to możliwe, ponieważ ciało będzie inne. Nawet jeśli aktualizowałeś ten sam zasób, możesz mieć różne aktualizacje (z różnymi wartościami), a ignorowanie niektórych z nich jest naprawdę nieoczekiwanym zachowaniem. – falconizer

+0

Idempentent czasownik powinien mieć ten sam efekt, niezależnie od tego, ile razy został wywołany. To jest wymagane przez standard. –

+0

Огњен Шобајић, może to być prawda, tylko jeśli żądanie jest dokładnie takie samo. Powiedzmy, że mamy dwie prośby: "PUT:/api/users/1", z ciałami '{" name ":" Foo "}' i '{" name ":" Bar "}'. Bycie idempotentnym nie oznacza, że ​​drugie żądanie zostanie zignorowane, prawda? Oznacza to tylko, że perfekcja dokładnie tego samego żądania będzie miała taki sam efekt, jak wykonanie go tylko raz. –

Powiązane problemy