Mit den Update-Funktionen in der v.Api kannst du bestimmte Datensätze vollständig oder teilweise aktualisieren.
Die Update Funktionen in der v.Api sind immer als Http-PUT
Funktionen ausgeführt. Funktionen, die als Http-POST
gekennzeichnet sind können zwar unter Umständen im Einzelfall auch Daten ändern, sind aber keine Update-Funktionen und deswegen intern anders aufgebaut.
v.Api – Aktualisieren von Daten über Http-PUT
Inhalt
- Aufbau der Update-Funktionen
- Datenintegrität sicherstellen mit dem X-Hash Header
- Empfohlene Vorgehensweise für das Aktualisieren
1. Aufbau der Update-Funktionen
Http-PUT: Query
Der Query einer Update-Funktion ist immer im Schema PUT /api/Datentyp/{id}
aufgebaut.
Als {id}
musst du die ID des Datensatzes angeben, den du aktualisieren möchtest. Die ID ist der Primärschlüssel des Datensatzes in v.Soft.
Je nach Datentyp kann das ein String
, ein Int
oder eine Guid (UUID)
sein.
Http-PUT: Body
Die eigentlichen Daten werden der PUT-Methode als JSON-Body übergeben.
Bitte beachte: Auch die Daten, die du nicht ändern möchtest, müssen im JSON-Body übergeben werden. Die Api nimmt sonst an, dass du diese auf NULL
setzen möchtest. Am einfachsten ist es deshalb, sich vor jeder PUT
Methode die aktuellen Daten des Datensatzes per GET
Methode zu holen.
Die empfohlene Vorgehensweise für das Aktualisieren über die Http-PUT
Methoden ist deshalb:
- Abfrage der aktuellen Daten über
Http-GET
- Aus dem Ergebniss den
JSON-Body
bilden. Datenfelder diereadonly
sind können weggelassen werden - Die Daten die geändert werden sollen im
JSON-Body
aktualisieren - Nun die
Http-PUT
Methode mit demJSON-Body
aufrufen der in den vorherigen Schritten generiert wird
Http-PUT: Auth
Wie bei allen Funktionen muss der Http-PUT
Methode ein gültiger JWT-Token als Authentifizierung als AUTH Bearer-Token
hinterlegt werden. Bitte beachte außerdem, dass die Update-Funktionen immer auch das entsprechende Recht des Benutzers in v.Soft erfordern. Der JWT-Token muss deswegen mit dem entsprechenden Claim für die Update-Funktion ausgestattet sein.
Http-PUT: Response
Die Update bzw. Http-PUT
Methoden antworten mit den folgenden HTTP-Statuscodes:
- 204 – No content: Die Aktualisierung bzw. das Update war erfolgreich.
- 400 – Bad request: Update nicht erfolgreich. Der Grund wird als Nachricht mitgegeben.
- 401 – Unauthorized: Der JWT-Token ist ungültig oder nicht vorhandenen.
- 403 – Forbidden: Dem Benutzer fehlt entsprechende Recht in v.Soft für das aktualisieren des Datensatzes.
- 409 – Conflict: Der Datensatz ist gerade in Bearbeitung oder es kam zu einer Parallelitätsverletzung.
2. Datenintegrität sicherstellen mit dem X-Hash Header
Motivation
Wie oben beschrieben empfehlen wir dir, vor jeder Http-PUT
Methode die aktuellen Daten über Http-GET
abzufragen. Wenn die GET
und die PUT
allerdings zeitlich weiter auseinanderliegen besteht die Gefahr, dass ein anderer Benutzer die Daten in der Zwischenzeit verändert hat. Würde man die Http-PUT
nun einfach ohne Prüfung ausführen, würde man die geänderten Daten des anderen Benutzers unter umständen wieder mit den alten Daten überschreiben.
Dieses Verhalten nennt man Parallelitätsverletzung.
In v.Soft stellt die Datenbank über Transaktionen sicher, dass es zu keinen Parallelitätsverletzung kommt. Da die v.Api zustandslos arbeitet ist dieser Weg hier nicht möglich. Stattdessen erlauben es die Http-PUT
Methoden, einen Hash der Originaldatei im Header mit zusenden. Die v.Api kann dann über den Hash prüfen, ob sich an den Originaldatei in der Zwischenzeit etwas verändert hauptsächlich
Bilden des Hashwertes
Den Hash der Originaldaten kannst du auf zwei Arten bilden bzw. abfragen:
- Hashwert über die v.Api abfragen:
Dazu kannst du die entsprechendeHttp-HEAD
des Datensatzes nutzen. Im Response-Header erhältst du den Hash direkt viaX-Hash
- Hashwert selbst erzeugen:
Frage die Daten dazu überHttp-GET
ab. Anschließend kannst du einenSHA1
-Hash über den kompletten Response-Body bilden. Bitte achte darauf, dass duUTF-8
als Zeichencodierung verwendest.
Falls du den Hashwert selber erzeugen möchtest kannst du die Funktion /api/Test/Hash
der Api verwenden um zu testen, ob deine Hash-Funktion den selben Wert liefert wie die Hash-Funktion der v.Api.
Die Funktion zeigt dir Beispieldaten und den Hashwert, den die v.Api dafür generiert. Deine Funktion zum erzeugen des SHA1
-Hashwertes sollte den selben Hashwert liefern wie diese Funktion.
Validieren des Hashwertes
Den Hashwert den du manuell erzeugt oder über die Api abgefragt hast kannst du bei der nächsten Http-PUT
mitschicken. Benutze dafür den optionalen X-Hash
Header. Wenn du einen Hashwert mitschickst, prüft die Api vor dem Update, ob sich an den Daten des Datensatzes etwas geändert hat. Dazu simuliert die v.Api intern einen Http-GET
Methode, bildet den Hashwert und vergleicht diesen mit dem Hashwert, den du im X-Hash
Header mitgeschickt hast. Falls die Hashwerte sich unterscheiden wird die Update-Funktion nicht ausgeführt und die v.Api liefert dir 409 - Conflict
als Ergebnis zurück.
3. Empfohlene Vorgehensweise für das Aktualisieren
Die empfohlene vollständige Vorgehensweise (inklusive X-Hash) für das Aktualisieren über die Http-PUT
Methoden ist ein GET
/PUT
-Zyklus, der wie folgt aussieht:
- Abfrage der aktuellen Daten über
Http-GET
- Aus dem Ergebnis der
Http-GET
Methode denJSON-Body
bilden. Datenfelder diereadonly
sind können weggelassen werden SHA
-Hashwert über diese Daten bilden (oder perHttp-HEAD
abfragen)- Die Daten die geändert werden sollen im
JSON-Body
aktualisieren - Nun die
Http-PUT
Methode mit demJSON-Body
aufrufen der in den vorherigen Schritten generiert wird. Den Hashwert alsX-Hash
Header mitgeben - Ergebnis der
Http-PUT
auswerten - Falls 409 – Daten neu abfragen, Benutzer warnen oder Update abbrechen