Durum kodları · 1xx–5xx
409, 412 ve 428: çakışma ve kayıp güncelleme
Veri yarışı, ETag önkoşulu ve iş kuralı çakışmasını ayır.
Kavramı anlayalım
İki kullanıcı aynı kaydı okuduğunda son yazan diğerinin değişikliğini sessizce silebilir. If-Match ile istemci okuduğu ETag sürümünü gönderir. Sunucu güncel sürümle eşleşme bulamazsa 412 Precondition Failed döner. Kontrol ve yazma veritabanında atomik olmalıdır; önce SELECT sonra kontrolsüz UPDATE yapmak yarışı çözmez.
428 Precondition Required, API’nin güncellemede koşullu istek zorunluluğunu anlatır. Önkoşul hiç gönderilmemişken 428; gönderilmiş ama sağlanmıyorken 412 düşünülebilir. 428 yanıtları cache’lenmemelidir. 409 Conflict, isteğin kaynak durumuyla çatışmasıdır: zaten kapatılmış siparişi yeniden onaylamak veya benzersizlik kuralına aykırı durum bunun örnekleri olabilir. Her database exception’ını 409’a çevirmek doğru değildir.
Frontend 412 alınca güncel temsil ve değişiklikleri karşılaştırıp kullanıcıya birleştirme seçeneği sunabilir. Kör retry aynı eski ETag’i yeniden yollar ve veri kaybını gizleyebilir. If-None-Match koşulunun methoda göre 304 veya 412 üretebileceğini öğren: cache doğrulayan GET ile koşullu yazma aynı sonuç değildir. ETag bir yetki mekanizması değildir; yetki denetimi ayrıca gerekir.
Çok kullanıcılı editör ve panel kayıtlarını güvenle güncellerken.
ETag denetimini yazmadan ayrı yapmak ve yarışın çözüldüğünü sanmak.
Aynı konu. Üç farklı derinlik.
If-Match: "v3"
HTTP/1.1 412 Precondition FailedSunucuda artık v4 var; eski bilgiyle yazma reddedildi.
Bu sayfa dış sunuculara istek göndermez. HTTP mesajları temsili, HTTP/1.1 biçiminde okunabilir gösterimlerdir; HTTP/2 ve HTTP/3 wire formatı değildir. example.test ayrılmış öğretim alan adıdır. Komut ve JavaScript örneklerini yalnız kendi test ortamında uygula; gerçek token veya cookie yayımlama.
Önce kendin dene.
ETag zorunlu endpoint’e If-Match göndermedin. 412 mi 428 mi?
Çözümü ve açıklamasını göster
HTTP/1.1 428 Precondition RequiredPolitika önkoşul istiyor; başarısız bir karşılaştırma henüz yok.