Potenza idem
Seguendo la RFC, un PUT dovrebbe consegnare l'oggetto completo alla risorsa. La ragione 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 idem-potente. Se hai due clienti. Client A e B, quindi il seguente scenario può evolvere:
Il cliente A ottiene un'immagine dalle immagini delle risorse. Questo contiene una descrizione dell'immagine, che è ancora valida. Il cliente 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à a un'incoerenza, l'immagine ha i metadati sbagliati allegati!
Ancora più fastidioso è che qualsiasi intermediario può ripetere la richiesta. Nel caso in cui decida in qualche modo il PUT fallito.
Il significato di PUT non può essere modificato (sebbene tu possa abusarne).
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 le applicazioni semplici, va bene. Questo metodo non è garantito come idem potente. Il client deve inviare una richiesta nel seguente formato:
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 segnalare 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 supportano questo, ma questa è l'opzione più naturale in un servizio REST.
Esempio di richiesta di patch:
link
Patch Json
L'opzione JSON sembra essere abbastanza completa e un'opzione interessante. Ma può essere difficile da implementare per terze parti. Devi decidere se la tua base di utenti può gestirlo.
È anche un po 'complicato, perché è necessario creare un piccolo interprete che converte i comandi in una struttura parziale, che si intende utilizzare per aggiornare il modello. Questo interprete dovrebbe anche controllare, se i comandi forniti hanno un senso. Alcuni comandi si annullano a vicenda. (scrivi fielda, cancella fielda). Penso che tu voglia riportarlo 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 il POST sia accettabile qui.
Non funziona male
Se decidi di andare con l'opzione PUT, che è piuttosto rischioso. Quindi non dovresti almeno scartare l'errore. L'utente ha una certa aspettativa (i dati saranno aggiornati) e se interrompi questo, darai a alcuni sviluppatori non un buon momento.
Potresti scegliere di tornare indietro: 409 Conflict o 403 Forbidden. Dipende da come si guarda al processo di aggiornamento. Se la vedi come un insieme di regole (incentrate sul sistema), allora il conflitto sarà più bello. Qualcosa di simile, questi campi non sono aggiornabili. (In conflitto con le regole). Se lo vedi come un problema di autorizzazione (incentrato sull'utente), allora dovresti tornare proibito. Con: non sei autorizzato a cambiare questi campi.
Dovresti ancora forzare gli utenti a inviare tutti i campi modificabili.
Un'opzione ragionevole per far rispettare questo è impostarla su una sotto-risorsa, che offre solo i dati modificabili.
Opinione personale
Personalmente andrei (se non dovessi lavorare con i browser) per il semplice modello PATCH e poi lo estenderò con un processore patch JSON. Questo può essere fatto differenziando sui mimetipi:
Il tipo mime di patch json:
application / json-patch
E JSON:
application / json-patch
facilita l'implementazione in due fasi.