Aikido

Genel API sözleşmelerinin ihlal edilmesini önleme: geriye dönük uyumluluğun korunması

Bakım Kolaylığı

Kural

Kaçınılması gerekenler kural kamu API sözleşmelerini
Değişiklikler değişiklikler genel API API değişiklikler olabilecek bozacak
mevcut istemci isteklerini şunlardır bozuluyor değişiklikler.
Düşünün şunu API'yi API sözleşmesini bir bir promise  değiştirme
değiştirmek değiştirmek değiştirmek bağımlı bağımlı buna bozulur kodlarını kodunu bozar.

Desteklenen diller: PHP, Java, C#, Python, JavaScript, TypeScript

Giriş

Halka açık API’ler, hizmetiniz ile bu hizmeti kullananlar arasındaki sözleşmelerdir. İstemciler bir uç noktanın istek biçimine, yanıt yapısına veya davranışına bağımlı hale geldiklerinde, bu unsurlarda yapılan değişiklikler istemcilerin kodlarında hataya neden olur. Geriye dönük değişiklikler, tüm istemcilerin aynı anda güncelleme yapmasını zorunlu kılar; ancak istemcileri kontrol edemediğiniz durumlarda bu genellikle imkânsızdır. Mobil uygulamalar zorla güncellenemez, üçüncü taraf entegrasyonlar için geçiş süresi gerekir ve eski sistemler hiçbir zaman güncellenmeyebilir.

Neden önemli?

Müşteri kesintileri ve güven: Ani API değişiklikleri, üretim ortamındaki istemci uygulamalarında anında arızalara yol açar. Kullanıcılar hatalarla karşılaşır, veri kaybı yaşar veya hizmetin tamamen kesilmesiyle karşı karşıya kalır. Bu durum, API sağlayıcıları ile tüketiciler arasındaki güveni zedeler ve istikrarlı API’lerin istikrarlı kalacağına dair zımni sözleşmeyi ihlal eder.

Koordinasyon maliyetleri: Birden fazla istemci ekibi arasında uyumsuzluklara yol açan değişiklikleri koordine etmek maliyetli ve zaman alıcıdır. Her ekibin kodu güncellemesi, değişiklikleri test etmesi ve devreye alması için zamana ihtiyacı vardır. İstemcileri bilinmeyen genel API’lerde (mobil uygulamalar, üçüncü taraf entegrasyonları) ise koordinasyon imkânsızdır.

Sürüm çoğalması: Kötü yönetilen geriye dönük uyumsuz değişiklikler, birden fazla API sürümünün aynı anda sürdürülmesine yol açar. Her sürüm için ayrı kod yolları, testler, belgeler ve hata düzeltmeleri gerekir; bu da bakım yükünü katlanarak artırır.

Kod örnekleri

❌ Uygun değil:

// Version 1: Original API
app.get('/api/users/:id', async (req, res) => {
    const user = await db.users.findById(req.params.id);
    res.json({ id: user.id, name: user.name });
});

// Version 2: Breaking change - renamed field
app.get('/api/users/:id', async (req, res) => {
    const user = await db.users.findById(req.params.id);
    res.json({
        id: user.id,
        fullName: user.name  // Breaking: 'name' renamed to 'fullName'
    });
});

Neden yanlış: name alanının adını fullName olarak değiştirmek, name alanını bekleyen tüm mevcut istemcilerin çalışmasını engeller. response.name alanına erişen istemci kodu, undefined değeriyle karşılaşacak ve bu da hatalara yol açacaktır. Bu değişiklik, tüm istemcilerin aynı anda güncellenmesini zorunlu kılar; aksi takdirde hata oluşur.

✅ Uygunluk:

// Version 2: Additive change - keeps old field, adds new
app.get('/api/users/:id', async (req, res) => {
    const user = await db.users.findById(req.params.id);
    res.json({
        id: user.id,
        name: user.name,           // Keep for backward compatibility
        fullName: user.name        // Add new field (deprecated 'name')
    });
});

// Or use API versioning
app.get('/api/v2/users/:id', async (req, res) => {
    const user = await db.users.findById(req.params.id);
    res.json({ id: user.id, fullName: user.name });
});

Bunun önemi: Eskiyi korumak ad Bu alan, yeni özellikler eklerken geriye dönük uyumluluğu korur tamAdı yeni müşteriler için. Alternatif olarak, yeni bir sürüm numaralı uç nokta oluşturmak (/api/v2/) hâlâ bunu kullanan mevcut istemcileri etkilemeden uyumsuz değişiklikler yapılmasına olanak tanır /api/v1/.

Sonuç

API’leri kademeli değişikliklerle geliştirin: yeni alanlar ekleyin, yeni uç noktalar ekleyin, isteğe bağlı parametreler ekleyin. Geriye dönük uyumsuzluklar kaçınılmaz olduğunda, API sürümlemeyi kullanarak eski ve yeni sürümleri eşzamanlı olarak çalıştırın. Eski alanları kaldırmadan önce, net zaman çizelgeleri ve geçiş kılavuzları ile bu alanları kullanımdan kaldırılacağını bildirin.

Sık Sorulan Sorular

Sorularınız mı var?

Hangi değişiklikler kural ihlali olarak kabul edilir?

Yanıtlardan alanların kaldırılması, alanların yeniden adlandırılması, alan türlerinin değiştirilmesi (dize yerine sayı), isteğe bağlı parametrelerin zorunlu hale getirilmesi, mevcut durumlar için HTTP durum kodlarının değiştirilmesi, kimlik doğrulama gerekliliklerinin değiştirilmesi ve hata yanıtı biçimlerinin değiştirilmesi. Yeni zorunlu istek parametrelerinin eklenmesi veya uç noktaların tamamen kaldırılması da uyumsuz değişikliklerdir.

Müşterilerin sistemlerini etkilemeden yeni zorunlu alanları nasıl ekleyebilirim?

Yeni alanı başlangıçta isteğe bağlı olarak ve makul bir varsayılan değerle ayarlayın. Değişikliği belgelendirin ve müşterilere buna uyum sağlamaları için zaman tanıyın. Yeterli süre geçtikten sonra (halka açık API’ler için 6-12 ay), yeni bir API sürümünde bu alanı zorunlu hale getirin. Sürüm güncellemesi yapmadan mevcut isteğe bağlı alanları asla zorunlu hale getirmeyin.

API sürümleme ile kullanımdan kaldırma arasındaki fark nedir?

Sürümleme, eski uç noktanın yanına yeni bir uç nokta (/v2/users) oluşturur ve her ikisinin bir arada var olmasını sağlar. Kullanımdan kaldırma, eski bir uç noktayı veya alanı işlevselliğini koruyarak eskimiş olarak işaretler ve sonunda kaldırılması için bir zaman çizelgesi belirler. Büyük değişiklikler için sürümlemeyi, küçük özelliklerin kademeli olarak kullanımdan kaldırılması için ise kullanımdan kaldırma yöntemini kullanın.

Kullanımdan kaldırılan API sürümlerini ne kadar süreyle tutmalıyım?

Genel API’ler için, kullanımdan kaldırılan sürümleri en az 12-18 ay boyunca desteklemeye devam edin. Dahili API’ler için ise, geçiş takvimi konusunda müşteri ekipleriyle koordinasyon sağlayın. Kullanımdan kaldırılan uç noktaları devre dışı bırakmadan önce her zaman önceden bildirimde bulunun (en az 3-6 ay önceden). Kapatma işleminden önce müşterilerin geçişini tamamladığından emin olmak için kullanım metriklerini izleyin.

Yanıt alanlarının sırasını değiştirebilir miyim?

Evet, JSON nesnesindeki alanların sırası API sözleşmesinin bir parçası değildir. İyi yazılmış istemciler, JSON’u konumuna göre değil, alan adına göre çözümler. Ancak, bazı kötü yazılmış istemcilerin alan sırasına bağlı kalabileceğini göz önünde bulundurarak kapsamlı bir şekilde test etmelisiniz. Dizilerde ise sıra genellikle önemlidir ve belgelenmedikçe değiştirilmemelidir.

URL yolunda değişiklik yapmadan API’leri nasıl sürümlendirebilirim?

HTTP başlıklarını kullanın: Accept: application/vnd.myapi.v2+json veya API-Version: 2 gibi özel başlıklar. Sorgu parametreleri de işe yarar: /api/users?version=2. Başlıklar aracılığıyla içerik uyumu daha temiz bir yöntemdir, ancak tarayıcılarda test edilmesi daha zordur. Bir strateji seçin ve bunu tutarlı bir şekilde uygulayın.

Şimdi güvenliğinizi sağlayın

Kodunuzu, bulutunuzu ve çalışma zamanınızı tek bir merkezi sistemde güvenceye alın.
Güvenlik açıklarını otomatik olarak hızla bulun ve düzeltin.

Kredi kartı gerekmez | Tarama sonuçları 32 saniyede.