Serverrespons 412 Precondition Failed
Begrip van statuscode 412
HTTP-statuscode 412 (Precondition Failed) geeft aan dat een of meer voorwaarden die zijn opgegeven in de headers van de aanvraag niet zijn vervuld. Dit kan nuttig zijn voor het implementeren van voorwaardelijke aanvragen, waarbij de cliënt wil bevestigen dat de bron niet is gewijzigd voordat een operatie wordt uitgevoerd.
Voorwaarden die leiden tot een fout
De foutmelding 412 kan optreden onder verschillende omstandigheden. De meest voorkomende zijn:
- De opgegeven
If-Match
header komt niet overeen met de huidige versie van de bron. - De
If-Unmodified-Since
header geeft een datum aan die eerder is dan de laatste wijzigingsdatum van de bron. - De
If-None-Match
header bevat een waarde die niet overeenkomt met de huidige ETag van de bron.
Voorbeelden van gebruik
Voorbeeld met de header If-Match
Stel je voor dat een cliënt een update van een bron wil uitvoeren, maar wil ervoor zorgen dat de versie die wordt bijgewerkt de verwachte versie is. De cliënt stuurt een verzoek met de volgende header:
If-Match: "abc123"
Als de huidige ETag van de bron echter "xyz789" is, zal de server een 412-statuscode retourneren, omdat de voorwaarden niet zijn vervuld.
Voorbeeld met de header If-Unmodified-Since
In een ander scenario wil een cliënt een bron bijwerken, maar alleen als deze niet is gewijzigd sinds een bepaalde datum. De header kan er als volgt uitzien:
If-Unmodified-Since: Wed, 21 Oct 2015 07:28:00 GMT
Als de bron echter is gewijzigd na deze datum, zal de server ook hier een 412-statuscode retourneren.
Voorbeeld met If-None-Match
Een cliënt vraagt informatie op met de If-None-Match
header, die de ETag van de bron bevat. Dit kan bijvoorbeeld als volgt zijn:
If-None-Match: "xyz789"
Als de huidige ETag "xyz789" is, betekent dit dat de bron niet is gewijzigd, en de server zal een 304 Not Modified-status retourneren. Als de ETag echter anders is, kan de server een 412-statuscode terugsturen.
Fout 412 verhelpen in verschillende programmeertalen
Corrigeren in Python
Hieronder volgt een voorbeeld van hoe je de fout 412 kunt afhandelen met de requests
bibliotheek in Python:
import requests
response = requests.put('https://example.com/resource', headers={'If-Match': '"abc123"'})
if response.status_code == 412:
print('De voorwaarde is niet vervuld. De bron is mogelijk gewijzigd.')
Corrigeren in JavaScript
Bij gebruik van de fetch
API in JavaScript kan de fout als volgt worden afgehandeld:
fetch('https://example.com/resource', {
method: 'PUT',
headers: {
'If-Match': '"abc123"'
}
}).then(response => {
if (response.status === 412) {
console.log('De voorwaarde is niet vervuld.');
}
});
Corrigeren in Java
In Java kan de HttpURLConnection
worden gebruikt om de fout 412 als volgt te verwerken:
import java.net.HttpURLConnection;
import java.net.URL;
URL url = new URL("https://example.com/resource");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("PUT");
connection.setRequestProperty("If-Match", "\"abc123\"");
int responseCode = connection.getResponseCode();
if (responseCode == 412) {
System.out.println("De voorwaarde is niet vervuld.");
}
Vergelijking van gedrag op verschillende platforms
Server Technologie | Gedrag bij 412 |
---|---|
Apache | Geeft 412 bij niet-overeenkomende If-Match headers. |
Nginx | Verwerkt voorwaardelijke headers en retourneert 412 indien nodig. |
Node.js | Kan 412 retourneren afhankelijk van middleware-configuratie. |
Toepassing van statuscode 412
De statuscode 412 is nuttig in situaties waarin de integriteit van gegevens belangrijk is. Het is vooral relevant voor applicaties die samenwerking vereisen of waar gegevensconsistentie cruciaal is.
Er zijn echter enkele beperkingen. Het gebruik van 412 kan leiden tot extra complexiteit in de client-logica, vooral wanneer meerdere voorwaarden moeten worden gecontroleerd. Dit kan ook gevolgen hebben voor de gebruikerservaring als de fout niet goed wordt afgehandeld.
Aanvullende codes
Code | Beschrijving |
---|---|
412.0 | Voorwaarde mislukt - Het verzoek bevat een ongeldige If-Match-header. |