2014-06-18 12 views
5

Diciamo che sto creando un'interfaccia RESTful e voglio caricare una risorsa usando PUT a /resources/{id}. Ma voglio solo caricare la cosa se non è stata caricata prima.RESTful PUT se non esiste?

Mi rendo conto che PUT dovrebbe essere idempotente, quindi se Iqualcosa due volte per lo stesso URL dovrebbe riuscire entrambe le volte, giusto?

Capisco anche che potrei usare HEAD su una risorsa esistente, e poi use an ETag al mio PUT per garantire che la risorsa non è stato modificato dall'ultima volta che ho controllato.

Ma come posso garantire di caricare una cosa solo se la cosa non esiste già? Cioè, come posso assicurarmi di non calpestare la cosa di qualcun altro?

risposta

4

mi rendo conto che PUT dovrebbe essere idempotente, quindi se ho messo qualcosa di due volte allo stesso URL si deve avere successo entrambe le volte a destra?

Corretto.

Ma come posso garantire di caricare solo una cosa se la cosa non esiste già ? Cioè, come posso assicurarmi di non calpestare qualcuno della cosa di altro?

Non utilizzare una chiamata HEAD. Effettua una chiamata PUT utilizzando l'intestazione If-None-Match: *. Questo indicherà al server per eseguire solo l'operazione se non esiste entità corrente, come dettagliato nel RFC 2616 paragrafo 3.

3

Vedi http://greenbytes.de/tech/webdav/rfc7232.html#rfc.section.3.2.p.7:

"If-None-Match può essere utilizzato anche con un valore di" * "per evitare che un metodo di richiesta non sicuro (ad esempio, PUT) modifichi inavvertitamente una rappresentazione esistente della risorsa di destinazione quando il client crede che la risorsa non abbia una rappresentazione corrente (Sezione 4.2.1 di [RFC7231]). Questa è una variazione sul problema di "aggiornamento perso" che potrebbe verificarsi se più di un client tenta di creare una rappresentazione iniziale per la risorsa di destinazione. "