2014-10-15 15 views
5

Se sto usando un UUID di identificare il soggetto come parte della mia URI del mio riposo endpoint:altri messi vs POST con UUID

/entities/<uuid>/ 

e che UUID è generato dal cliente durante la creazione di nuove entità, è Esiste una buona pratica per quanto riguarda l'utilizzo di PUT rispetto a POST? In altre parole, il UUID viene generato dal client anziché dal server.

Se dovessi utilizzare PUT, è previsto che il payload del messaggio contenga anche lo UUID? In questo caso sia il messaggio che l'URI che identificano l'entità conterranno lo UUID.

Per spec, si veda: il REST RFC

+1

Si confonde "REST" con "HTTP". Non esiste "REST RFC". C'è un "RFC HTTP", ma al giorno d'oggi non è più RFC 2616. –

risposta

3

Dal momento che (il client) conosce già l'UUID, direi PUT è la migliore pratica, e non c'è bisogno di inserire UUID nel payload. Certo, vs POST è alquanto controverso e la lettura e la rilettura della RFC non lo chiariscono completamente. Ma penso che il precedente sia ortodossia.

Vedere PUT vs POST in REST per una bella discussione.

+0

È vero che "non è necessario includere UUID nel payload"? Ciò sembra contraddire ciò che ha detto @nikita sulla necessità di includere l'UUID poiché fa parte della rappresentazione della risorsa. –

+0

Il nome della risorsa non deve essere parte della rappresentazione. –

0

La differenza principale tra POST e PUT:

POST viene utilizzato per aggiungere nuove entità. POST è non idempotente. Ciò significa che se invii dieci volte la richiesta POST, creerai dieci diverse entità. Di solito si dovrebbe ottenere il codice di risposta 201 (creato) alla richiesta POST accoppiato con l'intestazione di posizione che punta all'URL della risorsa appena creata. Nel tuo caso suggerisco nella quale inserire l'URL sthm come

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

Risposta:

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

PUT richiesta viene utilizzato per modificare lo stato esistente. PUT è idempotente. Di solito riceverai 200 (OK) codice di risposta.

È necessario contenere UUID nel carico utile PUT/POST. UUID fa parte della rappresentazione della tua risorsa. PUT e POST trasferiscono entrambe la rappresentazione sul server REST per modificare/aggiungere lo stato della risorsa.

BTW non si deve usare il termine URI in REST. L'URI è sthm che potrebbe non avere una rappresentazione, sebbene l'URL abbia sempre una rappresentazione.

+0

Se ho un vincolo di univocità su UUID, questo non cambia nulla (Questo è essenzialmente un must poiché faccio affidamento su UUID per una ricerca canonica per l'entità)? Quindi, se provo a POST lo stesso UUID più volte, solo il primo è riuscito con successo 201. Dovrei preoccuparmi che se dovessi usare PUT per creare sto specificando i dati in quanto l'URL e il carico utile contengono entrambi (si spera) stesso UUID? –

+0

1. Nel tuo caso (visto che stai generando UUID sul client) i POST successivi dovrebbero rispondere 409 (Conflitto). Ad ogni modo dovresti includere UUID nel POST poiché il server dovrebbe indirizzarti alla risorsa che ha creato per il client. Lo crea usando UUID fornito dal client.2. È la migliore pratica. È il modo in cui client e server si comunicano reciprocamente, trasferendo le rappresentazioni avanti e indietro. – nikita

+0

Vuoi dire che dovresti includere l'UUID in 'PUT'? presumibilmente devi includerlo nel POST poiché l'URL non include l'UUID. –

1

Comprendere la differenza tra PUT e POST.

PUT è pensato per sostituire la risorsa (http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.6) indicata dall'URI con una nuova. Ed è idempotente, cioè quante volte lo invochi con lo stesso carico utile, il risultato è lo stesso; renderà la stessa risorsa disponibile attraverso l'URI.

Quindi, se la risorsa non è già presente, ne viene creata una nuova. Anche in questo caso il risultato è lo stesso, cioè renderà disponibile la stessa risorsa attraverso l'URI.

POST si intende creare una sottorisorsa (http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.5) alla risorsa indicata dall'URI.Se la risorsa è una lista, aggiungerà un elemento ad essa. Se è un oggetto allora dovrebbe aggiungere qualcosa all'elemento, un attributo può essere.

Quindi, idealmente se l'elemento indicato dall'URI non è disponibile, dovrebbe essere una condizione di errore. Può essere un "404". Il POST consiste nell'aggiungere a una risorsa esistente.

Venendo alla tua domanda, è meglio usare POST con "/ entities /" come URI come da descrizione sopra. Non si dovrebbe utilizzare un UUID di risorse inesistente nell'URI con il metodo POST. Se stai usando PUT quindi usa "/ entities /".

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: ... 
} 

risposta dovrebbe essere lo stesso

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

sebbene PUT è idempotente ma se il metodo PUT viene riutilizzato allora dovrebbe usare 200 o 204 in risposta.

La seconda domanda: idealmente i dettagli della risorsa completa devono essere nel payload PUT anziché solo nell'URI.

+0

Hai presentato due modi per creare una nuova risorsa: 'POST' senza UUID e' PUT' con l'UUID. Quale di questi è preferito in questo caso in cui l'UUID viene generato lato client? –

+0

Preferisco POST senza UUID per creare una nuova risorsa. Perché l'ho tenuto in questo modo che un URI dovrebbe sempre puntare a una risorsa esistente. In questo modo non mi confondo. Anche per rendere PUT realmente idempotente, dovrebbe sempre ritornare con la stessa risposta se il carico utile è lo stesso. Ma se crei una nuova risorsa con PUT e anche l'aggiornamento con PUT restituirà due diversi tipi di risposte. Nel creare è 201 e altrimenti è 200. Ciò interrompe la semantica. – Jangid