Idem Potenz
Nach dem RFC müsste ein PUT das gesamte Objekt an die Ressource liefern. Der Hauptgrund dafür ist, dass PUT idempotent sein sollte. Dies bedeutet, dass eine wiederholte Anforderung auf dem Server zu demselben Ergebnis führen sollte.
Wenn Sie Teilaktualisierungen zulassen, kann es nicht mehr idem-potent sein. Wenn Sie zwei Kunden haben. Client A und B, dann kann das folgende Szenario entstehen:
Client A erhält ein Bild von Ressourcenbildern. Dies enthält eine Beschreibung des Bildes, die noch gültig ist. Der Client B erstellt ein neues Image und aktualisiert die Beschreibung entsprechend. Das Bild hat sich geändert. Kunde A sieht, er muss die Beschreibung nicht ändern, weil es so ist, wie er es wünscht und nur das Bild setzt.
Dies führt zu einer Inkonsistenz, das Bild hat die falschen Metadaten angehängt!
Noch ärgerlicher ist, dass jeder Vermittler die Anfrage wiederholen kann. Falls sich herausstellt, dass der PUT fehlgeschlagen ist.
Die Bedeutung von PUT kann nicht geändert werden (obwohl Sie es missbrauchen können).
Andere Optionen
Zum Glück gibt es noch eine andere Option: PATCH. PATCH ist eine Methode, mit der Sie eine Struktur teilweise aktualisieren können. Sie können einfach eine Teilstruktur senden. Für einfache Anwendungen ist dies in Ordnung. Es wird nicht garantiert, dass diese Methode gleich wirksam ist. Der Kunde sollte eine Anfrage in der folgenden Form senden:
PATCH /file.txt HTTP/1.1
Host: www.example.com
Content-Type: application/example
If-Match: "e0023aa4e"
Content-Length: 20
{fielda: 1, fieldc: 2}
Der Server kann mit 204 (ohne Inhalt) antworten, um den Erfolg zu melden. Im Fehlerfall können Sie einen Teil der Struktur nicht aktualisieren. Die PATCH-Methode ist atomar.
Der Nachteil dieser Methode ist, dass dies nicht von allen Browsern unterstützt wird. Dies ist jedoch die natürlichste Option in einem REST-Service.
Beispiel für eine Patch-Anforderung:
http://tools.ietf.org/html/rfc5789#section-2.1
Json Patchen
Die json-Option scheint ziemlich umfassend und eine interessante Option zu sein. Die Implementierung für Dritte kann jedoch schwierig sein. Sie müssen sich entscheiden, ob Ihre Benutzerbasis damit umgehen kann.
Es ist auch etwas kompliziert, da Sie einen kleinen Interpreter erstellen müssen, der die Befehle in eine Teilstruktur konvertiert, die Sie zum Aktualisieren Ihres Modells verwenden werden. Dieser Interpreter sollte auch prüfen, ob die angegebenen Befehle sinnvoll sind. Einige Befehle heben sich gegenseitig auf. (Feld schreiben, Feld löschen). Ich denke, Sie möchten dies dem Client zurückmelden, um die Debug-Zeit auf seiner Seite zu begrenzen.
Aber wenn Sie die Zeit haben, ist dies eine wirklich elegante Lösung. Sie sollten die Felder natürlich trotzdem validieren. Sie können dies mit der PATCH-Methode kombinieren, um im REST-Modell zu bleiben. Aber ich denke POST wäre hier akzeptabel.
Es wird schlecht
Wenn Sie sich für die Option PUT entscheiden, ist dies etwas riskant. Dann sollten Sie den Fehler zumindest nicht verwerfen. Der Benutzer hat eine gewisse Erwartung (die Daten werden aktualisiert) und wenn Sie dies brechen, werden Sie einigen Entwicklern keine gute Zeit geben.
Sie können wählen, ob Sie zurückweisen möchten: 409 Conflict oder 403 Forbidden. Es hängt davon ab, wie Sie den Aktualisierungsprozess betrachten. Wenn Sie es als eine Reihe von Regeln sehen (systemzentriert), wird der Konflikt schöner sein. Diese Felder können nicht aktualisiert werden. (Im Widerspruch zu den Regeln). Wenn Sie es als Autorisierungsproblem ansehen (benutzerzentriert), sollten Sie verboten zurückkehren. Mit: Sie sind nicht berechtigt, diese Felder zu ändern.
Sie sollten Benutzer dennoch zwingen, alle änderbaren Felder zu senden.
Eine sinnvolle Möglichkeit, dies durchzusetzen, besteht darin, sie auf eine Subressource festzulegen, die nur die veränderbaren Daten anbietet.
Persönliche Meinung
Persönlich würde ich mich für das einfache PATCH-Modell entscheiden (wenn Sie nicht mit Browsern arbeiten müssen) und es später mit einem JSON-Patch-Prozessor erweitern. Dies kann durch Unterscheidung der Mimetypen erfolgen: Der Mime-Typ des Json-Patches:
Anwendung / Json-Patch
Und json: application / json-patch
macht es einfach, es in zwei Phasen zu implementieren.