Potenza idem
A seguito della RFC, un PUT dovrebbe consegnare l'oggetto completo alla risorsa. Il motivo principale di ciò è che PUT dovrebbe essere idempotente. Ciò significa che una richiesta, che viene ripetuta, dovrebbe valutare lo stesso risultato sul server.
Se consenti aggiornamenti parziali, non può più essere potente. Se hai due clienti. Client A e B, quindi il seguente scenario può evolversi:
Il client A ottiene un'immagine dalle immagini delle risorse. Questo contiene una descrizione dell'immagine, che è ancora valida. Il client B inserisce una nuova immagine e aggiorna la descrizione di conseguenza. L'immagine è cambiata. Il cliente A vede, non deve cambiare la descrizione, perché è come desidera e mette solo l'immagine.
Questo porterà ad un'incoerenza, l'immagine ha i metadati sbagliati allegati!
Ancora più fastidioso è che qualsiasi intermediario può ripetere la richiesta. Nel caso decida in qualche modo che il PUT non è riuscito.
Il significato di PUT non può essere modificato (sebbene sia possibile utilizzarlo in modo improprio).
Altre opzioni
Fortunatamente c'è un'altra opzione, questa è PATCH. PATCH è un metodo che consente di aggiornare parzialmente una struttura. Puoi semplicemente inviare una struttura parziale. Per applicazioni semplici, va bene. Questo metodo non è garantito per essere potente. Il client deve inviare una richiesta nel seguente modulo:
PATCH /file.txt HTTP/1.1
Host: www.example.com
Content-Type: application/example
If-Match: "e0023aa4e"
Content-Length: 20
{fielda: 1, fieldc: 2}
E il server può rispondere con 204 (nessun contenuto) per contrassegnare il successo. In caso di errore non è possibile aggiornare una parte della struttura. Il metodo PATCH è atomico.
Lo svantaggio di questo metodo è che non tutti i browser lo supportano, ma questa è l'opzione più naturale in un servizio REST.
Esempio di richiesta di patch:
http://tools.ietf.org/html/rfc5789#section-2.1
Patch Json
L'opzione json sembra essere abbastanza completa e un'opzione interessante. Ma può essere difficile implementarlo per terze parti. Devi decidere se la tua base di utenti può gestirlo.
È anche un po 'contorto, perché è necessario creare un piccolo interprete che converte i comandi in una struttura parziale, che verrà utilizzata per aggiornare il modello. Questo interprete dovrebbe anche verificare se i comandi forniti hanno senso. Alcuni comandi si annullano a vicenda. (scrivi fielda, cancella fielda). Penso che tu voglia segnalarlo al cliente per limitare il tempo di debug dalla sua parte.
Ma se hai tempo, questa è una soluzione davvero elegante. Dovresti comunque convalidare i campi ovviamente. È possibile combinare questo con il metodo PATCH per rimanere nel modello REST. Ma penso che POST sarebbe accettabile qui.
Andare male
Se decidi di scegliere l'opzione PUT, che è alquanto rischiosa. Quindi non dovresti almeno scartare l'errore. L'utente ha una certa aspettativa (i dati verranno aggiornati) e se lo rompi, regalerai ad alcuni sviluppatori non un buon momento.
Puoi scegliere di tornare indietro: 409 Conflict o 403 Forbidden. Dipende da come guardi il processo di aggiornamento. Se lo vedi come un insieme di regole (incentrate sul sistema), allora il conflitto sarà più bello. Qualcosa del genere, questi campi non sono aggiornabili. (In conflitto con le regole). Se lo vedi come un problema di autorizzazione (incentrato sull'utente), allora dovresti tornare vietato. Con: non sei autorizzato a modificare questi campi.
Dovresti comunque forzare gli utenti a inviare tutti i campi modificabili.
Un'opzione ragionevole per imporlo è di impostarlo su una sotto-risorsa, che offre solo i dati modificabili.
Opinione personale
Personalmente andrei (se non devi lavorare con i browser) per il semplice modello PATCH e poi estenderlo con un processore di patch JSON. Questo può essere fatto differenziando sui mimetipi: il tipo mime di patch json:
application / json-patch
E json: application / json-patch
semplifica l'implementazione in due fasi.