Ich implementiere einen RESTful Webdienst, der auf eine Datenbank zugreift. Die Entitäten in der Datenbank sind versioniert, um mehrere Aktualisierungen zu erkennen. Wenn der aktuelle Wert zum Beispiel {"name":"Bill", "comment":"tinker", "version":3}
wenn ein Benutzer PUTs {"name":"Bill", "comment":"tailor", "version":3}
ist die Anfrage erfolgreich (200 OK) und der neue Wert lautet {"name":"Bill", "comment":"tailor", "version":4}
. Wenn ein zweiter Benutzer PUTs {"name":"Bill", "comment":"sailor", "version":3"}
wird diese Anfrage fehlschlagen (409 Conflict), da die Versionsnummer nicht übereinstimmt.
Es gibt bereits nicht-RESTful-Schnittstellen, so dass das Design der Datenbanken nicht geändert werden kann. Die RESTful-Schnittstelle ruft eine bestehende Schnittstelle auf, die die Details der Versionsprüfung übernimmt.
Als Faustregel für RESTful-Webdienste gilt, dass man sich, wann immer möglich, an die Details von HTTP halten sollte. Wäre es in diesem Fall besser, eine bedingte Kopfzeile in der Anfrage zu verwenden und 412 Precondition Failed zurückzugeben, wenn die Version nicht übereinstimmt? Der geeignete Header scheint If-Match zu sein. Dieser Header nimmt ein ETag (Entity Tag) auf, das ein Hash der Darstellung des aktuellen Zustands der Ressource sein könnte.
Wenn ich das täte, wären die ETags nur zum Schein, denn die Version wäre immer noch die echte, für die ich teste.
Gibt es irgendeinen Grund, warum ich dies tun sollte, andere als "machen es mehr RESTful", was auch immer das bedeuten soll?