HTTPQUERY
Deutsch

412 Precondition Failed

Verwendung

Wenn die Fehlermeldung 412 Precondition Failed empfangen wird, weiß der Client, dass eine oder mehrere in der Anfrage angegebene Bedingungen nicht erfüllt waren und sich die Ressource nicht im erwarteten Zustand befand. Das konkrete Verhalten hängt vom Vorbedingungs-Header ab. Ein Fehlschlag von If-Match liefert bei jeder Methode 412 zurück. Ein Fehlschlag von If-None-Match liefert bei GET und HEAD 304 zurück und bei allen anderen Methoden 412.

Das ähnelt 304, wobei im Fall von 304 eine Ressource deshalb nicht gesendet wurde, weil der Client bereits über die aktuellste verfügbare Version verfügte und eine erneute Übertragung unnötig ist.

SEO-Auswirkung

Suchmaschinen wie Google indexieren keine URL mit dem Antwortstatus 412. Zuvor indexierte URLs werden aus den Suchergebnissen entfernt.

Beispiel

Der Client möchte auf einen Blogbeitrag antworten, aber nur unter der Bedingung, dass der Beitrag seit dem letzten Aufruf der Ressource durch den Client nicht geändert wurde. Die Bedingung ist Bestandteil des If-Unmodified-Since-Headers. Ist die Bedingung nicht erfüllt, wurde die Ressource verändert, und der Server antwortet mit 412 Precondition Failed, um anzuzeigen, dass die Anfrage nicht ausgeführt wurde.

Durch die Einhaltung dieses Ablaufs wird das Problem einer „verlorenen Aktualisierung“ vermieden. Verlorene Aktualisierungen treten auf, wenn mehrere Clients auf dieselbe Ressource schreiben und einer oder mehrere davon mit einer veralteten Version arbeiten. Indem sichergestellt wird, dass die Ressource nicht verändert wurde, wird das Überschreiben zwischenzeitlich geänderter Daten verhindert.

Anfrage

POST /blog/update?postid=111&task=reply HTTP/1.1
Host: example.com
If-Unmodified-Since: Fri, 1 Jan 2021 00:00:00 GMT
Content-Type: text/plain
Content-Length: 45

<Message body contains reply-text from the client>

Antwort

HTTP/1.1 412 Precondition Failed
Content-Type: text/html
Content-Length: 139

<html>
  <head>
    <title>Blog Update Error</title>
  </head>
  <body>
   <p>The post has changed since last viewed.</p>
  </body>
</html>

Behebung

Rufen Sie die aktuelle Version der Ressource mit einer GET- oder HEAD-Anfrage ab, um den neuesten ETag- oder Last-Modified-Wert zu erhalten. Ersetzen Sie den veralteten Validator im If-Match- oder If-Unmodified-Since-Header durch den aktuellen und wiederholen Sie die Anfrage.

Bei der Verwendung optimistischer Nebenläufigkeitskontrolle (verbreitet in REST-APIs und CMS-Plattformen) sieht der Ablauf so aus:

Das Leeren des Browser-Caches behebt 412-Fehler, die durch veraltete zwischengespeicherte Validatoren verursacht werden. Der Browser hält einen veralteten ETag oder Zeitstempel und hängt alte bedingte Header automatisch an Anfragen an.

Caching-Proxys und CDNs zwischen Client und Ursprungsserver liefern mitunter veraltete Validatoren aus. Prüfen Sie, ob die Proxy-Konfigurationen bedingte Header unverändert durchreichen. AWS CloudFront etwa liefert 412 zurück, wenn ein If-Match-Header einer GET-Anfrage nicht mit dem ETag des Objekts übereinstimmt. Vergewissern Sie sich in diesen Fällen, dass der CDN-Cache frisch ist, oder invalidieren Sie die Distribution.

412 im Vergleich zu 409

Sowohl 412 als auch 409 zeigen einen Zustandskonflikt an, die Ursache unterscheidet sich jedoch. Eine 412-Antwort bedeutet, dass ein Vorbedingungs-Header (If-Match oder If-Unmodified-Since) als falsch ausgewertet wurde. Eine 409-Antwort bedeutet, dass die Anfrage unabhängig von bedingten Headern mit dem aktuellen Zustand der Ressource in Konflikt steht. Verwenden Sie 412 für optimistische Nebenläufigkeitsprüfungen, die auf ETags oder Zeitstempeln beruhen. Verwenden Sie 409 für Konflikte der Geschäftslogik wie doppelte Einträge oder ungültige Zustandsübergänge.

Code-Referenzen

.NET

HttpStatusCode.PreconditionFailed

Rust

http::StatusCode::PRECONDITION_FAILED

Rails

:precondition_failed

Go

http.StatusPreconditionFailed

Symfony

Response::HTTP_PRECONDITION_FAILED

Python3.5+

http.HTTPStatus.PRECONDITION_FAILED

Java

java.net.HttpURLConnection.HTTP_PRECON_FAILED

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_PRECONDITION_FAILED

Angular

@angular/common/http/HttpStatusCode.PreconditionFailed