412 Precondition Failed
Penggunaan
Ketika pesan error 412 Precondition Failed diterima, klien mengetahui bahwa satu atau beberapa kondisi yang ditentukan dalam request gagal terpenuhi, dan sumber daya tidak berada dalam state yang diharapkan. Perilaku spesifiknya bergantung pada header prakondisi. Kegagalan If-Match mengembalikan 412 untuk metode apa pun. Kegagalan If-None-Match mengembalikan 304 untuk GET dan HEAD, serta 412 untuk semua metode lainnya.
Hal ini mirip dengan 304, meskipun pada kasus 304 sumber daya tidak dikirim karena klien sudah memiliki versi terbaru yang tersedia, sehingga pengiriman berikutnya tidak diperlukan.
Dampak SEO
Mesin pencari seperti Google tidak akan mengindeks URL dengan status respons 412. URL yang sebelumnya terindeks akan dihapus dari hasil pencarian.
Contoh
Klien ingin membalas sebuah tulisan blog, tetapi hanya dengan syarat tulisan tersebut belum berubah sejak terakhir kali klien melihat sumber daya itu. Kondisi tersebut disertakan sebagai bagian dari header If-Unmodified-Since. Ketika kondisi itu gagal, berarti sumber daya telah dimodifikasi, dan server merespons dengan 412 Precondition Failed untuk menunjukkan bahwa request tidak diselesaikan.
Dengan mengikuti protokol ini, masalah “lost update” dapat dihindari. Lost update terjadi ketika beberapa klien menulis ke sumber daya yang sama, dan satu atau lebih di antaranya bekerja dengan versi yang sudah usang. Dengan memastikan sumber daya belum dimodifikasi, penimpaan atas data yang berubah di sela-sela waktu tersebut dapat dicegah.
Permintaan
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>
Respons
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>
Cara memperbaiki
Ambil versi terkini dari sumber daya dengan request GET atau HEAD untuk memperoleh nilai ETag atau Last-Modified terbaru. Ganti validator usang pada header If-Match atau If-Unmodified-Since dengan yang terkini, lalu ulangi request.
Ketika menggunakan kontrol konkurensi optimistis (umum pada REST API dan platform CMS), alur kerjanya adalah:
Membersihkan cache browser mengatasi error 412 yang disebabkan oleh validator usang yang ter-cache. Browser menyimpan ETag atau timestamp yang sudah kedaluwarsa dan melampirkan header bersyarat lama pada request secara otomatis.
Proxy caching dan CDN di antara klien dan server asal terkadang menyajikan validator yang usang. Pastikan konfigurasi proxy meneruskan header bersyarat tanpa modifikasi. AWS CloudFront, misalnya, mengembalikan 412 ketika header If-Match pada request GET tidak cocok dengan ETag objek tersebut. Dalam kasus seperti ini, pastikan cache CDN masih segar atau lakukan invalidation pada distribusi tersebut.
412 vs 409
Baik 412 maupun 409 menandakan konflik state, tetapi penyebabnya berbeda. Respons 412 berarti sebuah header prakondisi (If-Match atau If-Unmodified-Since) dievaluasi bernilai salah. Respons 409 berarti request bertentangan dengan state sumber daya saat ini, terlepas dari header bersyarat. Gunakan 412 untuk pemeriksaan konkurensi optimistis yang digerakkan oleh ETag atau timestamp. Gunakan 409 untuk konflik logika bisnis seperti entri duplikat atau transisi state yang tidak valid.
Referensi kode
.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