Sie arbeiten mit einem Kollegen an einem wichtigen Dokument in einem webbasierten Editor. Sie beide öffnen dasselbe Dokument gleichzeitig. Sie verbringen 30 Minuten damit, die Einleitung sorgfältig neu zu schreiben, während Ihr Kollege am Fazit arbeitet. Sie klicken zuerst auf „Speichern“, und Ihre Änderungen werden akzeptiert. Dann klickt Ihr Kollege auf „Speichern“, und seine Version überschreibt Ihre brillante neue Einleitung vollständig und ohne Warnung. Ihre Arbeit ist soeben dem „Lost Update Problem“ zum Opfer gefallen.
Dieses frustrierende Szenario ist genau das, was der HTTP-Statuscode 428 Precondition Required verhindern soll. Er ist einer der ausgefeilteren und proaktiveren Statuscodes in der HTTP-Spezifikation und dient als Schutzmechanismus für Ressourcen, die möglicherweise von mehreren Benutzern gleichzeitig geändert werden.
Er gehört nicht zu den üblichen Verdächtigen, spielt aber dennoch eine unglaublich wichtige Rolle bei der sicheren, zuverlässigen und gleichzeitigen API-Kommunikation.
Was genau bedeutet also der HTTP-Statuscode 428 Precondition Required? Wann tritt er auf und wie kann man ihn richtig handhaben?
Stellen Sie sich ihn wie einen vorsichtigen Bibliothekar vor, der Ihnen ein Buch erst dann ausleiht, wenn Sie bestätigen, dass Sie wissen, welche Ausgabe Sie aktualisieren. Es ist die Art des Servers zu sagen: „Ich muss sicherstellen, dass Sie mit der aktuellsten Version dieser Ressource arbeiten, bevor ich Ihnen erlaube, Änderungen vorzunehmen.“
Wenn Sie kollaborative Anwendungen, APIs, die gleichzeitige Updates verarbeiten, oder Systeme entwickeln, bei denen Datenkonsistenz entscheidend ist, ist das Verständnis von 428 unerlässlich.
Genau das werden wir in diesem ausführlichen Artikel beleuchten, damit Sie nicht nur verstehen, was 428 bedeutet, sondern auch, warum es existiert und wie es Ihre APIs verbessern kann.
428-Antworten korrekt verarbeiten kann.Nun wollen wir untersuchen, wie HTTP 428 Precondition Required das Problem widersprüchlicher Updates löst.
Das Problem: Das gefürchtete Lost Update
Um zu verstehen, warum 428 existiert, müssen wir das Problem würdigen, das es löst. In Mehrbenutzersystemen können mehrere Probleme auftreten, wenn zwei oder mehr Personen versuchen, dieselbe Ressource etwa zur gleichen Zeit zu aktualisieren:
- Verlorene Updates: Das klassische Problem, bei dem der zweite Schreibvorgang den ersten überschreibt, ohne dessen Änderungen zu berücksichtigen.
- Widersprüchliche Änderungen: Zwei Benutzer nehmen unterschiedliche Änderungen an verschiedenen Teilen derselben Ressource vor.
- Veraltete Daten-Updates: Ein Benutzer nimmt Änderungen basierend auf veralteten Informationen vor.
Traditionelle Ansätze verlassen sich oft darauf, dass der Client „das Richtige tut“, indem er bedingte Header einfügt. Aber was, wenn der Client das vergisst? Der Code 428 ermöglicht es dem Server, gutes Verhalten zu erzwingen.
Was bedeutet HTTP 428 Precondition Required eigentlich?
Der Statuscode 428 Precondition Required zeigt an, dass der Ursprungsserver eine bedingte Anfrage erfordert. Es ist die Art des Servers, zu verlangen, dass der Client bedingte Header (wie If-Match oder If-Unmodified-Since) einfügen muss, um zu beweisen, dass er mit aktuellen Daten arbeitet.
Die Antwort sollte eine hilfreiche Erklärung enthalten, welche Vorbedingung erforderlich ist. Eine typische 428-Antwort sieht so aus:
HTTP/1.1 428 Precondition RequiredContent-Type: application/problem+json
{
"type": "<https://example.com/probs/conditional-required>",
"title": "Precondition Required",
"detail": "This resource requires conditional requests. Please include an If-Match or If-None-Match header.",
"instance": "/articles/123"
}
Der Server sagt im Wesentlichen: „Für diese spezielle Ressource akzeptiere ich keine blinden Updates. Sie müssen mir zeigen, dass Sie wissen, welche Version Sie zu ändern versuchen.“
Einfacher ausgedrückt erwartet der Server, dass der Client einen Vorbedingungs-Header wie If-Match oder If-Unmodified-Since einfügt, bevor er bereit ist, die Anfrage zu verarbeiten.
Wenn diese Vorbedingung nicht enthalten ist, wird der Server die Anfrage ablehnen und mit einem 428 Precondition Required-Fehler antworten.
Offizielle RFC-Definition
Der 428-Statuscode ist in RFC 6585 definiert, der mehrere zusätzliche HTTP-Statuscodes einführte, um die Webkommunikation und Zuverlässigkeit zu verbessern.
Hier ist, was es besagt:
„Der Statuscode 428 (Precondition Required) zeigt an, dass der Ursprungsserver eine bedingte Anfrage erfordert. Sein Zweck ist es, das Problem des ‚Lost Update‘ zu verhindern, bei dem ein Client den Zustand einer Ressource abruft, ihn ändert und ihn per PUT an den Server zurücksendet, während eine dritte Partei die Ressource in der Zwischenzeit geändert hat.“
Das ist eine Menge technischer Fachjargon, aber die Essenz ist einfach: Es geht um Datenintegrität und die Vermeidung von Überschreibungen, wenn mehrere Clients dieselbe Ressource gleichzeitig ändern.
Einfach erklärt
Stellen Sie sich dieses Szenario vor:
Sie bearbeiten ein Dokument in Google Docs mit Ihren Teamkollegen. Sie öffnen das Dokument, nehmen einige Änderungen vor und klicken auf Speichern – aber in der Zwischenzeit hat Ihr Teamkollege ebenfalls Änderungen vorgenommen und seine Version vor Ihnen gespeichert.
Ohne Versionskontrolle würden Ihre Änderungen die des Teamkollegen überschreiben. Genau das hilft der Statuscode 428 Precondition Required in APIs zu verhindern.
Er sagt den Clients:
„Bevor Sie diese Ressource ändern, beweisen Sie mir, dass Sie mit der neuesten Version arbeiten.“
Warum wurde 428 eingeführt?
In RESTful APIs und allgemeinen HTTP-Operationen können Clients eine Ressource lesen, lokal Änderungen vornehmen und dann eine Update-Anfrage senden. Wenn sich die Ressource jedoch in der Zwischenzeit geändert hat, birgt das blinde Anwenden des Updates das Risiko, neuere Änderungen zu überschreiben.
Indem Server von Clients verlangen, Vorbedingungen anzugeben, stellen sie sicher:
- Der Client aktualisiert nur, wenn er mit der neuesten Version arbeitet.
- Widersprüchliche Anfragen werden erkannt und vermieden.
- Die Datenintegrität bleibt erhalten.
Dies ist entscheidend für APIs, die gleichzeitige Operationen oder mehrere Benutzer unterstützen.
Wie es funktioniert: Der bedingte Anfragefluss
Gehen wir ein vollständiges Beispiel durch, wie 428 hilft, verlorene Updates in einem kollaborativen Bearbeitungsszenario zu verhindern.
Schritt 1: Benutzer A ruft die Ressource ab
Benutzer A ruft das aktuelle Dokument ab:
GET /documents/123 HTTP/1.1
Der Server antwortet mit dem Dokument und fügt einen ETag-Header hinzu – eine eindeutige Kennung für diese spezifische Version der Ressource:
HTTP/1.1 200 OKContent-Type: application/jsonETag: "abc123"
{
"id": 123,
"title": "Project Proposal",
"content": "Original content...",
"version": "abc123"
}
Schritt 2: Benutzer B ruft dieselbe Ressource ab
Etwa zur gleichen Zeit fordert auch Benutzer B das Dokument an und erhält denselben ETag.
Schritt 3: Benutzer A versucht ein Update (ohne Bedingung)
Benutzer A versucht, das Dokument zu aktualisieren, vergisst aber, einen bedingten Header einzufügen:
PUT /documents/123 HTTP/1.1Content-Type: application/json
{
"id": 123,
"title": "Project Proposal",
"content": "User A's updated content...",
"version": "abc123"
}
Schritt 4: Die 428-Antwort des Servers
Da dieser Endpunkt so konfiguriert ist, dass er Vorbedingungen erfordert, antwortet der Server mit:
HTTP/1.1 428 Precondition RequiredContent-Type: application/json
{
"error": "precondition_required",
"message": "This resource requires conditional updates. Please include an If-Match header with the current ETag."
}
Schritt 5: Benutzer A versucht es erneut mit dem korrekten Header
Die Anwendung von Benutzer A sieht die 428-Antwort und versucht es automatisch erneut mit dem entsprechenden bedingten Header:
PUT /documents/123 HTTP/1.1Content-Type: application/jsonIf-Match: "abc123"
{
"id": 123,
"title": "Project Proposal",
"content": "User A's updated content...",
"version": "abc123"
}
Der Server verarbeitet diese bedingte Anfrage erfolgreich und gibt einen 200 OK mit einem neuen ETag zurück.
Schritt 6: Benutzer B versucht sein Update
Wenn Benutzer B versucht, mit seinem veralteten ETag zu aktualisieren, kann der Server dies nun mit einem 412 Precondition Failed ablehnen und so das verlorene Update verhindern.
428 vs. 412 Precondition Failed: Den Unterschied verstehen
Dies ist ein entscheidender Unterschied in der Welt der bedingten Anfragen:
428 Precondition Required: „Sie müssen einen bedingten Header einfügen, um diese Anfrage zu stellen.“ Der Server erzwingt, dass Clients bedingte Anfragen verwenden. Hier geht es darum, die Praxis einzufordern.412 Precondition Failed: „Sie haben einen bedingten Header eingefügt, aber die Bedingung ist fehlgeschlagen.“ Der Client hat das Richtige getan, indem er eine Bedingung eingefügt hat, aber die Bedingung wurde als falsch bewertet (z. B. stimmte der ETag nicht überein). Hier geht es um eine fehlgeschlagene Bedingung.
Analogie:
428: Ein Türsteher sagt: „Sie müssen Ihren Ausweis vorzeigen, um einzutreten.“ (Die Praxis einfordern)412: Der Türsteher prüft Ihren Ausweis und sagt: „Dieser Ausweis ist abgelaufen, Sie können nicht hinein.“ (Die spezifische Prüfung ist fehlgeschlagen)
Warum der 428 Precondition Required Status existiert
Auf den ersten Blick mag es wie ein Aufwand erscheinen. Warum sollten Clients nicht einfach frei aktualisieren dürfen?
Nun, der 428-Status existiert aus gutem Grund: um Datenverlust zu verhindern und Konsistenz in verteilten Systemen zu gewährleisten.
Lassen Sie uns seinen Zweck genauer untersuchen.
1. Vermeidung verlorener Updates
Das Problem des „Lost Update“ tritt auf, wenn mehrere Clients dieselbe Ressource abrufen und unabhängig voneinander aktualisieren. Ohne Vorbedingungen könnte das Update eines Clients das eines anderen stillschweigend überschreiben.
428 stellt sicher, dass jede Änderung überprüft, ob sich die Ressource seit dem Abruf geändert hat, wodurch stillschweigender Datenverlust verhindert wird.
2. Gewährleistung der Datenintegrität
Indem der Server Vorbedingungen wie If-Match verlangt, garantiert er, dass Updates nur auf die korrekte Version einer Ressource angewendet werden. Es ist, als würde man ein Sicherheitsschloss an seine Daten anbringen.
3. Förderung sicherer Parallelität
In Systemen, in denen viele Benutzer mit gemeinsamen Ressourcen interagieren – denken Sie an kollaborative Bearbeitung, API-Integrationen oder RESTful-Dienste – macht 428 das Parallelitätsmanagement vorhersehbarer und sicherer.
4. Förderung bewährter Verfahren
Durch die Erzwingung bedingter Anfragen drängt der Server Entwickler dazu, bewährte RESTful-Designpraktiken zu befolgen, wie die Verwendung von ETags, bedingten GETs und Versionsprüfungen.
Wann sollte 428 Precondition Required verwendet werden?
Sie sollten die Verwendung von 428 in diesen Szenarien in Betracht ziehen:
1. Kollaborative Bearbeitungsanwendungen
Anwendungen im Stil von Google Docs, bei denen mehrere Benutzer dasselbe Dokument gleichzeitig bearbeiten könnten.
2. Ressourcen mit hoher Konkurrenz
Jede Ressource, die häufige Updates von mehreren Quellen erhält, wie zum Beispiel:
- Produktbestandszahlen
- Ticketbuchungssysteme
- Abstimmungs- oder Bewertungssysteme
- Konfigurationseinstellungen
3. Updates sensibler Daten
Ressourcen, bei denen versehentliche Überschreibungen schwerwiegende Folgen haben könnten, wie Finanzunterlagen oder medizinische Daten.
4. API-Design für Sicherheit
Wenn Sie gutes Client-Verhalten erzwingen und häufige Parallelitätsprobleme verhindern möchten.
Praxisbeispiele für 428 Precondition Required
1. Gleichzeitige API-Bearbeitung
Wenn mehrere Clients denselben Datensatz gleichzeitig ändern, stellt 428 sicher, dass sich die Updates nicht gegenseitig überschreiben.
2. Versionierte APIs
APIs, die sich im Laufe der Zeit entwickeln, können Vorbedingungen erzwingen, um zu gewährleisten, dass Clients kompatible Versionen verwenden.
3. Optimistische Sperrsysteme
Datenbanken oder REST-APIs, die ETags zur optimistischen Parallelitätskontrolle verwenden, verlassen sich auf Vorbedingungen, um Konflikte zu erkennen.
4. Datei- oder Objektspeicher-APIs
Cloud-Speichersysteme wie S3 verwenden bedingte Anfragen intensiv – 428 wäre eine natürliche Wahl, um solche Regeln durchzusetzen.
APIs mit Apidog testen

Wenn es um die Parallelitätskontrolle geht, wird Apidog zu Ihrer Geheimwaffe. Das Testen bedingter Anfragesequenzen erfordert eine sorgfältige Einrichtung und mehrere Schritte. Apidog ist für diese Art von Tests perfekt geeignet.
Mit Apidog können Sie:
- Testszenarien erstellen: Erstellen Sie einen vollständigen Testablauf, der:
- Zuerst eine
GET-Anfrage sendet, um eine Ressource abzurufen und ihren ETag-Header zu erfassen - Dann eine
PUT-Anfrage ohne bedingte Header sendet, um zu überprüfen, ob der Server428zurückgibt - Schließlich eine
PUT-Anfrage mit dem erfassten ETag sendet, um ein erfolgreiches Update zu überprüfen
Header-Management automatisieren: Verwenden Sie die Umgebungsvariablen von Apidog, um ETag-Werte automatisch zu speichern und über Anfragen hinweg wiederzuverwenden.
Race Conditions simulieren: Erstellen Sie Testsuiten, die mehrere Benutzer simulieren, die dieselbe Ressource aktualisieren, indem sie parallele Anfragen mit verschiedenen ETags senden.
Fehlerantworten validieren: Stellen Sie sicher, dass Ihre 428-Antworten hilfreiche Fehlermeldungen enthalten, die Clients anleiten, was sie anders machen müssen.
Client-Resilienz testen: Überprüfen Sie, ob Ihre Client-Anwendungen 428-Antworten korrekt verarbeiten, indem sie mit den entsprechenden bedingten Headern erneut versuchen.
Bewährte Implementierungspraktiken
Für Server-Entwickler:
- Seien Sie konsistent: Wenn Sie Vorbedingungen für eine Methode (wie
PUT) benötigen, fordern Sie diese für alle zustandsändernden Methoden dieser Ressource. - Geben Sie klare Fehlermeldungen: Ihre
428-Antworten sollten klar erklären, welche Header erforderlich sind und wie der aktuelle Ressourcenzustand abgerufen werden kann. - Verwenden Sie Standard-Header: Halten Sie sich an Standard-Bedingungs-Header wie
If-Match,If-None-Match,If-Modified-SinceundIf-Unmodified-Since. - Berücksichtigen Sie eine fehlerfreie Herabstufung (Graceful Degradation): Bei weniger kritischen Ressourcen könnten Sie die fehlende Vorbedingung protokollieren, die Anfrage aber dennoch verarbeiten.
Für Client-Entwickler:
- Behandeln Sie 428 immer elegant (Gracefully): Wenn Sie eine
428erhalten, behandeln Sie sie nicht als fatalen Fehler. Rufen Sie stattdessen den aktuellen Ressourcenzustand ab und versuchen Sie es mit den entsprechenden bedingten Headern erneut. - ETags cachen: Speichern Sie ETags mit Ihren lokalen Ressourcenkopien, damit Sie diese für nachfolgende Updates bereithalten.
- Implementieren Sie eine automatische Wiederholungslogik: Erstellen Sie eine Logik, die
428-Antworten automatisch verarbeitet, indem sie erneut abruft und wiederholt.
Das größere Bild: Robuste APIs erstellen
Der Statuscode 428 Precondition Required stellt eine Verschiebung hin zu robusteren, selbstdokumentierenden APIs dar. Indem Sie von Clients verlangen, bedingte Anfragen zu verwenden, erreichen Sie:
- Datenverlust verhindern: Eliminierung ganzer Kategorien von Parallelitätsfehlern
- API-Sicherheit verbessern: Es wird für Clients schwieriger, Daten versehentlich zu beschädigen
- Bewährte Verfahren durchsetzen: Clients zu korrekten Nutzungsmustern führen
- Bessere Diagnosen bereitstellen: Klares Feedback geben, wenn Clients Fehler machen
Fazit: Von reaktiver zu proaktiver Fehlerbehandlung
Der HTTP-Statuscode 428 Precondition Required verwandelt die Parallelitätskontrolle von einer optionalen bewährten Methode in eine durchsetzbare Anforderung. Er verschiebt die Fehlerbehandlung von reaktiv („Ihr Update stand im Konflikt mit dem eines anderen“) zu proaktiv („Sie müssen beweisen, dass Sie mit aktuellen Daten arbeiten, bevor ich Ihr Update überhaupt in Betracht ziehe“).
Obwohl es wie ein zusätzlicher Schritt erscheinen mag, führt dieser Ansatz letztendlich zu zuverlässigeren Anwendungen und zufriedeneren Benutzern, die ihre Arbeit nicht durch stille Datenkorruption verlieren.
Für Entwickler, die moderne Webanwendungen erstellen, ist das Verständnis und die Implementierung von 428 ein Zeichen von Raffinesse im API-Design. Es zeigt, dass Sie nicht nur darüber nachdenken, was Ihre API tut, sondern auch, wie sie sich unter realen Bedingungen mit mehreren Benutzern verhält.
Und wenn Sie bereit sind, diese ausgeklügelten Parallelitätskontrollen zu implementieren und zu testen, bietet ein leistungsstarkes Tool wie Apidog die Testumgebung, die Sie benötigen, um sicherzustellen, dass Ihre bedingte Anfragelogik fehlerfrei funktioniert und die Daten Ihrer Benutzer sowie deren Seelenfrieden schützt.
