Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Für REST-Endpunkte möchten Entwickler häufig steuern, ob Updates neue Datensätze erstellen oder nur vorhandene ändern. Der If-Match HTTP-Header stellt dieses Steuerelement im Daten-API-Generator (DAB) bereit.
Standardmäßig werden DAB-Vorgänge behandelt PUT und PATCH als Upsert-Vorgänge verwendet:
Wenn die Ressource vorhanden ist, wird sie aktualisiert.
Wenn sie nicht vorhanden ist: Es wird eingefügt.
-
PUT→ vollständigen Upsert (ersetzt Ressource). -
PATCH→ inkrementellen Upsert (gilt für partielle Aktualisierung).
-
Hinzufügen von If-Match: * Änderungen dieses Verhaltens zur reinen Semantik.
Funktionsweise von If-Match in DAB
If-Match wird nur mit dem Wildcardwert *unterstützt.
| Headerwert | Verhalten |
|---|---|
If-Match: * |
Aktualisieren Sie nur, wenn die Ressource vorhanden ist; wenn → 404 nicht gefunden wurde. |
If-Match: <any other> |
Zurückgewiesen; 400 Ungültige Anforderung (Etags not supported, use '*'). |
| (nicht vorhanden) | Upsert-Verhalten (einfügen, wenn nicht gefunden, andernfalls aktualisieren). |
Verhaltensübersicht
- DAB implementiert keine ETag- oder Versionsabgleiche pro Datensatz.
- Es wird kein Parallelitätstoken ausgewertet.
*behauptet nur", dass "vorhanden" ist. - Gilt nur für REST, nicht für GraphQL.
- Für DELETE-Vorgänge ist derzeit nicht sinnvoll.
Verwenden von If-Match mit PUT
Ohne If-Matchwird PUT eingefügt, wenn die Ressource nicht vorhanden ist (gibt zurück 201 Created).
Beispiel für "Nur Aktualisieren"
Anfrage
PUT /api/Books/id/1
If-Match: *
Content-Type: application/json
{
"title": "The Return of the King"
}
Erfolg (Datensatz vorhanden)
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 1,
"title": "The Return of the King"
}
Fehler (Datensatz fehlt)
HTTP/1.1 404 Not Found
Content-Type: application/json
{
"error": "No Update could be performed, record not found"
}
Upsert insert example (no If-Match and record didn't exist)
Anfrage
PUT /api/Books/id/500
Content-Type: application/json
{
"title": "Inserted via PUT",
"publisher_id": 7
}
Antwort
HTTP/1.1 201 Created
Location: id/500
Content-Type: application/json
{
"id": 500,
"title": "Inserted via PUT",
"publisher_id": 7
}
Verwenden von If-Match mit PATCH
PATCH verhält sich ähnlich. Ohne If-Matchwird ein inkrementeller Upsert ausgeführt. Mit diesem Element If-Match: *werden nur vorhandene Zeilen aktualisiert.
Anfrage
PATCH /api/Books/id/1
If-Match: *
Content-Type: application/json
{
"title": "The Two Towers"
}
Antwort beim Erfolg
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 1,
"title": "The Two Towers"
}
Antwort, wenn nicht gefunden
HTTP/1.1 404 Not Found
Content-Type: application/json
{
"error": "No Update could be performed, record not found"
}
Ungültige verwendung von If-Match
Alle anderen Werte als * (einschließlich an zitierter Zeichenfolgen) werden abgelehnt.
Anfrage
PUT /api/Books/id/1
If-Match: "abc123"
Content-Type: application/json
{
"title": "To Kill a Mockingbird"
}
Antwort
HTTP/1.1 400 Bad Request
Content-Type: application/json
{
"error": "Etags not supported, use '*'"
}
Review
-
If-MatchLassen Sie die Upsert-Semantik (Einfüge-oder-Update-Semantik) aus. - Wird
If-Match: *für die strikte Nur-Update-Semantik verwendet (404, wenn das Element fehlt). - Verwenden Sie keinen anderen Wert. Der echte ETag-Abgleich ist nicht implementiert.