Web tabanlı bir düzenleyici kullanarak önemli bir belge üzerinde bir iş arkadaşınızla işbirliği yapıyorsunuz. İkiniz de aynı belgeyi aynı anda açıyorsunuz. İş arkadaşınız sonuç üzerinde çalışırken siz 30 dakikanızı girişi dikkatlice yeniden yazmaya ayırıyorsunuz. Önce "Kaydet"e tıklıyorsunuz ve değişiklikleriniz kabul ediliyor. Ardından iş arkadaşınız "Kaydet"e tıklıyor ve onların sürümü, herhangi bir uyarı vermeden sizin parlak yeni girişinizi tamamen üzerine yazıyor. Çalışmanız az önce "kayıp güncelleme sorunu"nun kurbanı oldu.
Bu sinir bozucu senaryo, 428 Precondition Required HTTP durum kodunun tam olarak önlemek için tasarlandığı şeydir. HTTP spesifikasyonundaki daha gelişmiş ve proaktif durum kodlarından biridir ve aynı anda birden fazla kullanıcı tarafından değiştirilebilecek kaynaklar için koruyucu bir mekanizma görevi görür.
Olağan şüphelilerden biri değildir, ancak güvenli, güvenilir ve eşzamanlı API iletişiminde inanılmaz derecede önemli bir rol oynar.
Peki, HTTP Durum Kodu 428 Precondition Required tam olarak ne anlama geliyor? Ne zaman ortaya çıkar ve doğru şekilde nasıl ele alabilirsiniz?
Bunu, hangi sürümü güncellediğinizi bildiğinizi onaylamadıkça bir kitabı ödünç almanıza izin vermeyen temkinli bir kütüphaneci gibi düşünün. Sunucunun "Değişiklik yapmanıza izin vermeden önce bu kaynağın en güncel sürümüyle çalıştığınızı kanıtlamanızı istiyorum" deme şeklidir.
İşbirlikçi uygulamalar, eşzamanlı güncellemeleri işleyen API'ler veya veri tutarlılığının kritik olduğu herhangi bir sistem geliştiriyorsanız, 428'i anlamak çok önemlidir.
İşte tam da bu derinlemesine incelemede ele alacağımız şey bu, böylece 428'in sadece ne anlama geldiğini değil, neden var olduğunu ve API'lerinizi nasıl daha iyi hale getirebileceğini anlayabileceksiniz.
428 yanıtlarını doğru şekilde işleyebilmesini sağlayarak ETag'ler ve başlıklarla koşullu istekleri test etmeyi kolaylaştıran hepsi bir arada bir API platformudur.Şimdi, HTTP 428 Precondition Required'ın çakışan güncellemeler sorununu nasıl çözdüğünü inceleyelim.
Sorun: Korkunç Kayıp Güncelleme
428'in neden var olduğunu anlamak için çözdüğü sorunu takdir etmemiz gerekiyor. Çok kullanıcılı sistemlerde, iki veya daha fazla kişi aynı kaynağı yaklaşık olarak aynı anda güncellemeye çalıştığında, birkaç sorunla karşılaşabilirsiniz:
- Kayıp Güncellemeler: İkinci yazmanın, ilk yazmanın değişikliklerini dahil etmeden üzerine yazdığı klasik sorun.
- Çakışan Değişiklikler: İki kullanıcının aynı kaynağın farklı kısımlarında farklı değişiklikler yapması.
- Eski Veri Güncellemeleri: Bir kullanıcının güncel olmayan bilgilere dayanarak değişiklikler yapması.
Geleneksel yaklaşımlar genellikle istemcinin koşullu başlıkları dahil ederek "doğru şeyi yapmasına" güvenir. Peki ya istemci unutursa? 428 kodu, sunucunun iyi davranışları zorlamasına olanak tanır.
HTTP 428 Önkoşul Gerekli Tam Olarak Ne Anlama Geliyor?
428 Precondition Required durum kodu, kaynak sunucunun isteğin koşullu olmasını gerektirdiğini belirtir. İstemcinin taze verilerle çalıştığını kanıtlamak için koşullu başlıklar (If-Match veya If-Unmodified-Since gibi) içermesini zorunlu kılan sunucunun bir yoludur.
Yanıt, hangi önkoşulun gerekli olduğuna dair faydalı bir açıklama içermelidir. Tipik bir 428 yanıtı şöyle görünür:
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"
}
Sunucu aslında şunu söylüyor: "Bu belirli kaynak için kör güncellemeleri kabul etmeyeceğim. Bana hangi sürümü değiştirmeye çalıştığınızı bildiğinizi göstermeniz gerekiyor."
Daha basit bir ifadeyle, sunucu isteği işlemeye istekli olmadan önce istemcinin If-Match veya If-Unmodified-Since gibi bir önkoşul başlığı eklemesini bekler.
Bu önkoşul dahil edilmezse, sunucu isteği reddeder ve bir 428 Precondition Required hatasıyla yanıt verir.
Resmi RFC Tanımı
428 durum kodu, web iletişimini ve güvenilirliğini artırmak için ek HTTP durum kodları tanıtan RFC 6585'te tanımlanmıştır.
Şöyle der:
"428 (Precondition Required) durum kodu, kaynak sunucunun isteğin koşullu olmasını gerektirdiğini belirtir. Amacı, bir istemcinin bir kaynağın durumunu GET yapıp, değiştirip ve sunucuya geri PUT yaptığı sırada, üçüncü bir tarafın bu arada kaynağı değiştirmesiyle ortaya çıkan 'kayıp güncelleme' sorununu önlemektir."
Bu çok fazla teknik jargondur, ancak özü basittir: birden fazla istemci aynı kaynağı eşzamanlı olarak değiştirdiğinde veri bütünlüğü ve üzerine yazmayı önleme ile ilgilidir.
Basit Bir Dille Açıklamak
Şu senaryoyu hayal edin:
Ekip arkadaşlarınızla Google Docs'ta bir belgeyi düzenliyorsunuz. Belgeyi açıyor, bazı düzenlemeler yapıyor ve Kaydet'e tıklıyorsunuz, ancak bu arada ekip arkadaşınız da değişiklikler yapmış ve sizden önce kendi sürümünü kaydetmiş.
Şimdi, sürüm kontrolü olmadan, sizin değişiklikleriniz onlarınkini üzerine yazardı. İşte tam da 428 Precondition Required durum kodu API'lerde bunu önlemeye yardımcı olur.
İstemcilere şunu söyler:
"Bu kaynağı değiştirmeden önce, en son sürümle çalıştığınızı bana kanıtlayın."
428 Neden Tanıtıldı?
RESTful API'lerde ve genel HTTP işlemlerinde, istemciler bir kaynağı okuyabilir, yerel olarak bazı değişiklikler yapabilir ve ardından bir güncelleme isteği gönderebilir. Ancak, kaynak bu arada değiştiyse, güncellemeyi körü körüne uygulamak, daha yeni değişikliklerin üzerine yazma riskini taşır.
İstemcilerin önkoşulları belirtmesini isteyerek, sunucular şunları sağlar:
- İstemci yalnızca en son sürümle çalışıyorsa günceller.
- Çakışan istekler tespit edilir ve önlenir.
- Veri bütünlüğü korunur.
Bu, eşzamanlı işlemleri veya birden fazla kullanıcıyı destekleyen API'ler için kritik öneme sahiptir.
Nasıl Çalışır: Koşullu İstek Akışı
İşbirlikçi bir düzenleme senaryosunda 428'in kayıp güncellemeleri önlemeye nasıl yardımcı olduğunu gösteren eksiksiz bir örneği inceleyelim.
Adım 1: A Kullanıcısı Kaynağı Çeker
A Kullanıcısı mevcut belgeyi alır:
GET /documents/123 HTTP/1.1
Sunucu belgeyle birlikte, kaynağın bu belirli sürümü için benzersiz bir tanımlayıcı olan bir ETag başlığı içerir:
HTTP/1.1 200 OKContent-Type: application/jsonETag: "abc123"
{
"id": 123,
"title": "Proje Önerisi",
"content": "Orijinal içerik...",
"version": "abc123"
}
Adım 2: B Kullanıcısı Aynı Kaynağı Çeker
Yaklaşık olarak aynı anda, B Kullanıcısı da belgeyi ister ve aynı ETag'i alır.
Adım 3: A Kullanıcısı Bir Güncelleme Dener (Koşulsuz)
A Kullanıcısı belgeyi güncellemeye çalışır ancak koşullu bir başlık eklemeyi unutur:
PUT /documents/123 HTTP/1.1Content-Type: application/json
{
"id": 123,
"title": "Proje Önerisi",
"content": "A Kullanıcısının güncellenmiş içeriği...",
"version": "abc123"
}
Adım 4: Sunucunun 428 Yanıtı
Bu uç nokta önkoşullar gerektirecek şekilde yapılandırıldığı için, sunucu şöyle yanıt verir:
HTTP/1.1 428 Precondition RequiredContent-Type: application/json
{
"error": "precondition_required",
"message": "Bu kaynak koşullu güncellemeler gerektiriyor. Lütfen mevcut ETag ile bir If-Match başlığı ekleyin."
}
Adım 5: A Kullanıcısı Doğru Başlıkla Yeniden Dener
A Kullanıcısının uygulaması 428 yanıtını görür ve uygun koşullu başlıkla otomatik olarak yeniden dener:
PUT /documents/123 HTTP/1.1Content-Type: application/jsonIf-Match: "abc123"
{
"id": 123,
"title": "Proje Önerisi",
"content": "A Kullanıcısının güncellenmiş içeriği...",
"version": "abc123"
}
Sunucu bu koşullu isteği başarıyla işler ve yeni bir ETag ile 200 OK döndürür.
Adım 6: B Kullanıcısı Kendi Güncellemesini Dener
B Kullanıcısı eski ETag'iyle güncelleme yapmaya çalıştığında, sunucu artık bunu 412 Precondition Failed hatasıyla reddedebilir ve kayıp güncellemeyi önler.
428 ve 412 Önkoşul Başarısız: Farkı Anlamak
Bu, koşullu istekler dünyasında çok önemli bir ayrımdır:
428 Precondition Required: "Bu isteği yapmak için koşullu bir başlık eklemeniz gerekir." Sunucu, istemcilerin koşullu istekleri kullanmasını zorunlu kılıyor. Bu, uygulamanın zorunlu kılınmasıyla ilgilidir.412 Precondition Failed: "Koşullu bir başlık eklediniz, ancak koşul başarısız oldu." İstemci, bir koşul ekleyerek doğru şeyi yaptı, ancak koşul yanlış olarak değerlendirildi (örneğin, ETag eşleşmedi). Bu, başarısız bir koşulla ilgilidir.
Benzerlik:
428: Bir gece kulübü fedaisinin "Girmek için kimliğinizi göstermelisiniz" demesi. (Uygulamayı zorunlu kılma)412: Fedainin kimliğinizi kontrol edip "Bu kimlik süresi dolmuş, içeri giremezsiniz" demesi. (Belirli kontrol başarısız oldu)
428 Önkoşul Gerekli Neden Var?
İlk bakışta bir sıkıntı gibi görünebilir. Neden istemcilerin serbestçe güncelleme yapmasına izin verilmiyor?
Şey, 428 durumu iyi bir nedenden dolayı var: dağıtılmış sistemlerde veri kaybını önlemek ve tutarlılığı sağlamak için.
Amacını daha ayrıntılı inceleyelim.
1. Kayıp Güncellemeleri Önleme
"Kayıp güncelleme" sorunu, birden fazla istemcinin aynı kaynağı çekip bağımsız olarak güncellemesiyle ortaya çıkar. Önkoşullar olmadan, bir istemcinin güncellemesi, diğerinin üzerine sessizce yazabilir.
428, her değişikliğin, kaynağın çekildiğinden beri değişip değişmediğini kontrol etmesini sağlayarak sessiz veri kaybını önler.
2. Veri Bütünlüğünü Sağlama
If-Match gibi önkoşullar gerektirerek, sunucu güncellemelerin yalnızca bir kaynağın doğru sürümüne uygulandığını garanti eder. Verilerinize bir güvenlik kilidi takmak gibidir.
3. Güvenli Eşzamanlılığı Teşvik Etme
Birçok kullanıcının paylaşılan kaynaklarla etkileşimde bulunduğu sistemlerde (işbirlikçi düzenleme, API entegrasyonları veya RESTful hizmetler gibi), 428 eşzamanlılık yönetimini daha öngörülebilir ve güvenli hale getirir.
4. En İyi Uygulamaları Teşvik Etme
Koşullu istekleri zorunlu kılarak, sunucu geliştiricileri ETag'ler, koşullu GET'ler ve sürüm kontrolleri gibi RESTful tasarım en iyi uygulamalarını takip etmeye iter.
428 Önkoşul Gerekli Ne Zaman Kullanılır?
428'i şu senaryolarda kullanmayı düşünmelisiniz:
1. İşbirlikçi Düzenleme Uygulamaları
Birden fazla kullanıcının aynı belgeyi aynı anda düzenleyebileceği Google Docs tarzı uygulamalar.
2. Yüksek Çekişmeli Kaynaklar
Birden fazla kaynaktan sık güncellemeler alan herhangi bir kaynak, örneğin:
- Ürün envanter sayımları
- Bilet rezervasyon sistemleri
- Oylama veya derecelendirme sistemleri
- Yapılandırma ayarları
3. Hassas Veri Güncellemeleri
Kazara üzerine yazmaların ciddi sonuçlar doğurabileceği kaynaklar, örneğin finansal kayıtlar veya tıbbi veriler.
4. Güvenlik İçin API Tasarımı
İyi istemci davranışını zorlamak ve yaygın eşzamanlılık sorunlarını önlemek istediğinizde.
428 Önkoşul Gerekli İçin Gerçek Dünya Senaryoları
1. Eşzamanlı API Düzenlemesi
Birden fazla istemci aynı kaydı eşzamanlı olarak değiştirdiğinde, 428 güncellemelerin birbirinin üzerine yazmamasını sağlar.
2. Sürümlü API'ler
Zamanla gelişen API'ler, istemcilerin uyumlu sürümleri kullandığını garanti etmek için önkoşulları zorlayabilir.
3. İyimser Kilitleme Sistemleri
İyimser eşzamanlılık kontrolü için ETag'leri kullanan Veritabanları veya REST API'leri, çakışmaları tespit etmek için önkoşullara güvenir.
4. Dosya veya Nesne Depolama API'leri
S3 gibi bulut depolama sistemleri koşullu istekleri yoğun bir şekilde kullanır; 428, bu tür kuralları uygulamak için doğal bir uyum sağlar.
Apidog ile API'leri Test Etme

Eşzamanlılık kontrolüyle uğraşırken, Apidog gizli silahınız olur. Koşullu istek akışlarını test etmek dikkatli kurulum ve birden fazla adım gerektirir. Apidog bu tür testler için mükemmel bir şekilde uygundur.
Apidog ile şunları yapabilirsiniz:
1. Test Senaryoları Oluşturma: Şunları içeren eksiksiz bir test akışı oluşturun:
- Önce, bir kaynağı çekmek ve ETag başlığını yakalamak için bir
GETisteği gönderir. - Ardından, sunucunun
428döndürdüğünü doğrulamak için koşullu başlıklar olmadan birPUTisteği gönderir. - Son olarak, başarılı güncellemeyi doğrulamak için yakalanan ETag ile bir
PUTisteği gönderir.
2. Başlık Yönetimini Otomatikleştirme: Apidog'un ortam değişkenlerini kullanarak ETag değerlerini istekler arasında otomatik olarak depolayın ve yeniden kullanın.
3. Yarış Koşullarını Simüle Etme: Farklı ETag'lerle paralel istekler göndererek birden fazla kullanıcının aynı kaynağı güncellemesini simüle eden test paketleri oluşturun.
4. Hata Yanıtlarını Doğrulama: 428 yanıtlarınızın, istemcilere farklı ne yapmaları gerektiği konusunda yol gösteren faydalı hata mesajları içerdiğinden emin olun.
5. İstemci Direncini Test Etme: İstemci uygulamalarınızın, uygun koşullu başlıklarla yeniden deneyerek 428 yanıtlarını doğru şekilde işlediğini doğrulayın.
Uygulama En İyi Uygulamaları
Sunucu Geliştiricileri İçin:
- Tutarlı Olun: Bir yöntem (PUT gibi) için önkoşullar gerektiriyorsanız, o kaynak üzerindeki tüm durumu değiştiren yöntemler için de bunları gerektirin.
- Net Hata Mesajları Sağlayın: 428 yanıtlarınız, hangi başlıkların gerekli olduğunu ve mevcut kaynak durumunun nasıl elde edileceğini açıkça açıklamalıdır.
- Standart Başlıkları Kullanın: If-Match, If-None-Match, If-Modified-Since ve If-Unmodified-Since gibi standart koşullu başlıklara bağlı kalın.
- Zarif Bozulmayı Düşünün: Daha az kritik kaynaklar için, eksik önkoşulu günlüğe kaydedebilir ancak isteği yine de işleyebilirsiniz.
İstemci Geliştiricileri İçin:
- 428'i Her Zaman Zarifçe Yönetin: 428 aldığınızda, bunu ölümcül bir hata olarak ele almayın. Bunun yerine, mevcut kaynak durumunu çekin ve uygun koşullu başlıklarla yeniden deneyin.
- ETag'leri Önbelleğe Alın: Yerel kaynak kopyalarınızla ETag'leri depolayın, böylece sonraki güncellemeler için hazırda bulunsunlar.
- Otomatik Yeniden Deneme Mantığı Uygulayın: 428 yanıtlarını yeniden çekerek ve yeniden deneyerek otomatik olarak işleyen bir mantık oluşturun.
Daha Büyük Resim: Sağlam API'ler Oluşturma
428 Precondition Required durum kodu, daha sağlam, kendi kendini belgeleyen API'lere doğru bir geçişi temsil eder. İstemcilerin koşullu istekleri kullanmasını isteyerek şunları yaparsınız:
- Veri Kaybını Önleme: Tüm eşzamanlılık hatası kategorilerini ortadan kaldırma.
- API Güvenliğini Artırma: İstemcilerin verileri yanlışlıkla bozmasını zorlaştırma.
- En İyi Uygulamaları Uygulama: İstemcileri doğru kullanım kalıplarına yönlendirme.
- Daha İyi Tanılama Sağlama: İstemciler hata yaptığında net geri bildirim verme.
Sonuç: Reaktiften Proaktif Hata Yönetimine
HTTP 428 Precondition Required durum kodu, eşzamanlılık kontrolünü isteğe bağlı bir en iyi uygulamadan uygulanabilir bir gereksinime dönüştürür. Hata yönetimini reaktif olmaktan ("güncellemeniz başkasınınkiyle çakıştı") proaktife ("güncellemenizi dikkate almadan önce güncel verilerle çalıştığınızı kanıtlamanız gerekir") taşır.
Ek bir adım gibi görünse de, bu yaklaşım nihayetinde daha güvenilir uygulamalara ve çalışmalarını sessiz veri bozulmasına kaybetmeyen daha mutlu kullanıcılara yol açar.
Modern web uygulamaları geliştiren geliştiriciler için, 428'i anlamak ve uygulamak, API tasarımında gelişmişliğin bir göstergesidir. Bu, API'nizin sadece ne yaptığını değil, aynı zamanda gerçek dünya koşullarında birden fazla kullanıcıyla nasıl davrandığını düşündüğünüzü gösterir.
Ve bu gelişmiş eşzamanlılık kontrollerini uygulamaya ve test etmeye hazır olduğunuzda, Apidog gibi güçlü bir araç, koşullu istek mantığınızın kusursuz çalıştığından emin olmak, kullanıcılarınızın verilerini ve akıl sağlıklarını korumak için ihtiyacınız olan test ortamını sağlar.
