İçeriğe Atla
Mustafa Erbay
Rehberler · 11 dk okuma · görüntülenme Read in English

API Versioning Seçimi: 3 Yaklaşımın Avantajları ve Dezavantajları

RESTful API'ler için yaygın kullanılan 3 API versioning yöntemini (URL Path, Query Parameter, Custom Header) karşılaştırıyorum. Hangi durumda hangisi daha…

100%

API Versioning: Neden Önemli?

Bir API geliştirmeye başladığımda, ilk aklıma gelen şeylerden biri “Bu API’nin gelecekteki değişimlerini nasıl yöneteceğim?” oluyor. Özellikle kurumsal projelerde, bir kez yayına alınan bir API’nin, yıllar boyunca farklı sistemler tarafından kullanılmaya devam ettiğini görüyorum. Bu noktada, geriye dönük uyumluluğu (backward compatibility) koruyarak yeni özellikler eklemek veya mevcutları değiştirmek kritik hale geliyor. İşte tam da bu yüzden API versioning konusu benim için her zaman öncelikli bir başlık olmuştur.

API versioning, aslında bir nevi “kullanıcıyı uyarma ve kontrollü geçiş sağlama” sanatı. Eğer bir API’yi değiştirir ve eski versiyonu aniden ortadan kaldırırsanız, o API’ye bağlı çalışan tüm sistemler patlar. Bu durum, genellikle beklenen bir şey değildir ve ciddi operasyonel sorunlara yol açabilir. Bu nedenle, API’lerimizde bir versiyonlama stratejisi belirlemek, sadece teknik bir gereklilik değil, aynı zamanda proaktif bir iletişim ve yönetim biçimidir. Kendi projelerimde de bu konuya hep önem verdim, çünkü bir kere yaşanan büyük bir kesinti bile tüm güveni zedeleyebiliyor.

Bu yazıda, API versioning için en sık kullanılan üç temel yöntemi ele alacağım: URL Path Versioning, Query Parameter Versioning ve Custom Header Versioning. Her birinin kendine has avantajları ve dezavantajları var. Hangi senaryoda hangisinin daha mantıklı olacağını, gerçek dünya örnekleriyle ve kendi deneyimlerimle anlatmaya çalışacağım. Amacım, bu yöntemlerin teknik detaylarını açıklamak ve size kendi projelerinizde doğru kararı vermenizde yardımcı olmak.

1. URL Path Versioning: En Yaygın Yaklaşım

API versioning denildiğinde akla ilk gelen yöntem genellikle URL Path Versioning’dir. Bu yöntemde, API’nin versiyonu doğrudan URL’in bir parçası haline getirilir. Örneğin, bir kullanıcı bilgilerini almak için GET /users/123 şeklinde bir istek yapıyorsak, farklı versiyonlar için bu URL şöyle görünebilir: GET /v1/users/123 veya GET /v2/users/123. Bu yaklaşım, URL’in kendisi üzerinden versiyon bilgisini net bir şekilde gösterdiği için oldukça anlaşılır ve kolay uygulanabilir.

Bu yöntemin en büyük avantajlarından biri, istemcilerin (client) hangi versiyonu kullandığını URL’e bakarak kolayca anlamasıdır. Sunucu tarafında da routing (yönlendirme) kurallarını belirlerken bu URL yapısı oldukça pratiktir. Örneğin, bir Nginx veya Traefik gibi reverse proxy sunucusunda, farklı versiyonlara giden istekleri ayrı servis örneklerine (instance) yönlendirmek bu yapı sayesinde çok daha basittir. location /v1/ { proxy_pass http://service-v1; } gibi kurallarla bu yönetim kolayca sağlanır. Kendi geliştirdiğim finansal hesaplayıcıların API’sinde de bu yöntemi kullandım, çünkü farklı kullanıcı gruplarına farklı özellik setleri sunmam gerekiyordu ve URL’in kendisi bu ayrımı net bir şekilde gösteriyordu.

Ancak URL Path Versioning’in bazı dezavantajları da yok değil. En belirgini, URL’in sürekli uzamasıdır. Eğer API’nizde çok fazla kaynak (resource) ve çok sayıda versiyon varsa, URL’ler oldukça karmaşık hale gelebilir. Ayrıca, bazı geliştiriciler veya araçlar, URL’lerdeki bu tür dinamik segmentleri önbelleğe alma (caching) konusunda sorun yaşayabilir. Bir diğer önemli nokta ise, HTTP’nin kendisinin URL’deki versiyon bilgisini bir “kaynak kimliği” olarak ele almasıdır. Bu, HTTP caching mekanizmalarının versiyonları farklı kaynaklar olarak görmesini sağlasa da, bazen istenmeyen davranışlara yol açabilir. Özellikle HTTP GET istekleri için bu durum daha belirgindir.

URL Path Versioning, özellikle RESTful API’lerde en çok benimsenen yöntemlerden biridir. Anlaşılırlığı ve basitliği sayesinde birçok proje için iyi bir başlangıç noktasıdır. Ancak, ölçeklenebilirlik ve URL karmaşıklığı gibi konuları göz önünde bulundurmak önemlidir. Özellikle API Gateway’ler veya servis mesh (service mesh) yapıları kullanılıyorsa, bu routing esnekliği büyük bir avantaj sağlar. Ancak unutulmamalıdır ki, sadece URL’i değiştirmek API’yi “versiyonlamış” olmaz; arkasındaki servis mantığının da bu versiyona göre davranması gerekir.

2. Query Parameter Versioning: Daha Esnek Bir Alternatif

URL Path Versioning’in URL’i uzatması ve karmaşıklaştırması gibi sorunlarına bir alternatif olarak Query Parameter Versioning karşımıza çıkıyor. Bu yöntemde, versiyon bilgisi URL’in sorgu parametreleri (query parameters) arasına eklenir. Örneğin, aynı kullanıcı bilgisini almak için şöyle bir istek yapabiliriz: GET /users/123?version=1 veya GET /users/123?version=2. Bu yaklaşım, temel kaynağın URL’ini (örneğin /users/123) sabit tutarak versiyon bilgisini ayrı bir parametre olarak iletir.

Bu yöntemin en büyük avantajı, URL’in daha temiz ve okunabilir kalmasıdır. Kaynak bazlı URL yapısı bozulmaz. Özellikle, eğer API’niz sadece belirli parametrelerle filtreleniyorsa ve versiyonlama bunun bir parçasıysa, bu yaklaşım mantıklı olabilir. Örneğin, bir ürün arama API’sinde GET /products?query=laptop&version=1 şeklinde kullanmak, URL Path Versioning’e göre daha az karmaşık görünebilir. Ayrıca, bu yöntem, HTTP caching için de bazı avantajlar sunabilir. Çünkü temel kaynak URL’i sabit kaldığı için, caching proxy’leri genellikle aynı kaynağı görürler. Ancak, sorgu parametrelerindeki değişiklikler cache anahtarını etkileyebilir, bu da dikkatli yönetilmesi gereken bir konudur.

Ancak Query Parameter Versioning’in de ciddi dezavantajları var. En önemlisi, bu yöntemin teknik olarak “doğru” bir RESTful yaklaşım olarak görülmemesidir. REST prensiplerine göre, URL bir kaynağı temsil etmeli ve sorgu parametreleri o kaynağın filtrelenmesi veya sıralanması için kullanılmalıdır. Versiyon bilgisi, kaynağın kendisinin bir parçası değil, API’nin bir özelliğidir. Bu nedenle, versiyon bilgisini sorgu parametresi olarak iletmek, REST’in ruhuna pek uygun düşmeyebilir. Ayrıca, bu yöntem, API dokümantasyon araçlarında (Swagger/OpenAPI gibi) bazen kafa karıştırıcı olabilir. Belirli bir kaynağın birden fazla “versiyonu” olduğunu belirtmek yerine, aynı kaynağın farklı “konfigürasyonları” gibi algılanabilir.

Kendi deneyimlerimde, özellikle kısa ömürlü veya iç sistemlerde kullanılan API’lerde Query Parameter Versioning’i tercih ettiğim oldu. Bu tür durumlarda, genellikle geliştirici ekipleri arasında hızlı bir iletişim kurularak geçişler yönetilebiliyor. Ancak, geniş kitlelere açık veya uzun vadeli stratejik API’lerde, bu yöntemin getirdiği semantik belirsizlikler ve REST prensiplerine uyumsuzluk nedeniyle daha az tercih ettiğimi söyleyebilirim. Özellikle, bu yöntemi kullandığınızda, API Gateway’lerde veya load balancer’larda routing kurallarını ayarlarken dikkatli olmanız gerekir.

3. Custom Header Versioning: Temiz ve Semantik Bir Seçenek

Üçüncü ve son popüler yöntemimiz ise Custom Header Versioning. Bu yaklaşımda, versiyon bilgisi HTTP isteğinin başlıklarından (headers) birine özel bir isimle eklenir. Genellikle X-API-Version veya Api-Version gibi bir isim kullanılır. Örneğin, bir isteği şöyle gönderebiliriz:

GET /users/123 HTTP/1.1
Host: api.example.com
Api-Version: 2
Accept: application/json

Bu yöntemin en büyük avantajı, URL’in tamamen temiz kalmasıdır. Kaynak URL’i değişmez, sorgu parametreleri sadece filtreleme için kullanılır. Bu, API’yi hem geliştiriciler hem de otomatik araçlar için daha anlaşılır hale getirir. Ayrıca, HTTP’nin doğasına daha uygun bir yaklaşımdır. Çünkü başlıklar, isteğin meta bilgilerini taşımak için tasarlanmıştır ve versiyon bilgisi tam olarak bu kategoriye girer. Bu, özellikle HTTP caching proxy’lerinin işini kolaylaştırabilir, çünkü versiyon bilgisi URL’in bir parçası olmadığı için cache anahtarları daha basit tutulabilir.

Ancak Custom Header Versioning’in de kendine göre zorlukları var. En belirgin olanı, bu yöntemin URL Path veya Query Parameter yöntemleri kadar kolay fark edilmemesidir. Bir geliştirici, API’yi kullanırken bu özel başlığı eklemeyi unutabilir. Bu durum, API’nin eski versiyonuna erişmeye çalışırken beklenmedik hatalara yol açabilir. Bu nedenle, bu yöntemi kullanırken, istemci kütüphanelerinde veya API dokümantasyonlarında bu başlığın önemini vurgulamak hayati önem taşır. Ayrıca, bazı proxy veya güvenlik duvarları, özel başlıkları farklı şekilde ele alabilir veya engelleyebilir, bu da ek konfigürasyon gerektirebilir.

Bir diğer önemli nokta da, X- öneki kullanımıdır. Başlangıçta X- öneki, standart olmayan başlıklar için kullanılırdı. Ancak bu, standartlaşma sorunlarına yol açtığı için artık önerilmemektedir. Yeni başlıklar için IANA (Internet Assigned Numbers Authority) tarafından atanmış isimler veya açıkça tanımlanmış standartlar kullanılmalıdır. Api-Version gibi başlıklar daha temiz bir seçenektir. Kendi projelerimde, bu yöntemi kullandığımda genellikle Api-Version gibi daha standart isimler tercih ettim ve istemci SDK’larımda bu başlığın otomatik olarak eklenmesini sağladım.

Hangi Yöntemi Seçmeli? Trade-off’lar ve Öneriler

Peki, bu üç yöntemden hangisini seçmeliyiz? Aslında bu sorunun kesin bir cevabı yok. Her yöntemin kendine has avantajları ve dezavantajları var ve en iyi seçim, projenizin özel gereksinimlerine, ekibinizin yeteneklerine ve API’nizin kullanım amacına bağlıdır. Ancak genel eğilimler doğrultusunda bazı önerilerde bulunabilirim.

Genel olarak, URL Path Versioning en yaygın ve başlangıç için en kolay yöntemdir. API’niz nispeten basitse veya hızlı bir şekilde hayata geçirilmesi gerekiyorsa, bu yöntem iyi bir başlangıç noktası olabilir. Ancak, API’niz büyüdükçe ve karmaşıklaştıkça, URL’lerin uzaması ve yönetimi zorlaşabilir. Bu yöntemi kullanırken, versiyon numaralarını tutarlı bir şekilde kullanmaya özen gösterin. Örneğin, v1, v1.0, v1.0.1 gibi farklı stiller yerine tek bir standarda bağlı kalın.

Query Parameter Versioning, URL’i daha temiz tutmak istediğinizde ve versiyonlamanın filtrelenmiş bir özellik gibi algılanabileceği senaryolarda düşünülebilir. Ancak, RESTful prensiplere olan uyumsuzluğu ve caching sorunları nedeniyle, genellikle büyük ve uzun ömürlü API’ler için ilk tercih olmamalıdır. Eğer bu yöntemi kullanacaksanız, HTTP caching stratejilerinizi çok dikkatli planlamanız gerekir.

Custom Header Versioning, bence en temiz ve semantik olarak en doğru yaklaşımdır. URL’i karmaşıklaştırmaz, HTTP standartlarına daha uygundur ve API Gateway’ler ile iyi entegre olur. Bu yöntemin ana zorluğu, istemcilerin bu başlığı eklemeyi unutma olasılığıdır. Bu nedenle, bu yöntemi seçtiğinizde, istemci kütüphanelerinizin bu başlığı otomatik olarak eklediğinden emin olmalı ve dokümantasyonunuzda bu konuyu net bir şekilde belirtmelisiniz. Kendi başıma, API Gateway’ler üzerinde çalıştığım projelerde bu yöntemi tercih ediyorum çünkü routing kurallarını yönetmek çok daha kolaylaşıyor.

Son olarak, versiyonlama sadece teknik bir konu değildir. Aynı zamanda bir iletişim stratejisidir. Yeni bir versiyon yayınladığınızda, eski versiyonun ne zaman kullanımdan kaldırılacağını (deprecation) açıkça belirtmeli ve geliştiricilere geçiş için yeterli süre tanımalısınız. Kendi projelerimde, geçiş için cömert bir deprecation süresi tanımayı tercih ediyorum. Bu süre zarfında, eski versiyonun hala çalışır durumda olduğunu garanti ediyor ve yeni versiyona geçiş için gerekli desteği sağlıyorum. Bu, hem kullanıcılarımızın mağdur olmasını engelliyor hem de bizim için daha sorunsuz bir geçiş süreci sağlıyor.

Versiyonlama Stratejileri: Karşılaştırma Tablosu

Aşağıdaki tablo, üç ana API versioning yönteminin temel özelliklerini özetlemektedir:

Özellik URL Path Versioning Query Parameter Versioning Custom Header Versioning
Yerleşim URL’in bir parçası (/v1/resource) URL’in sorgu parametresi (?version=1) HTTP isteği başlığı (Api-Version: 1)
Anlaşılırlık Yüksek Orta Orta-Yüksek
Uygulama Kolaylığı Yüksek Yüksek Orta
RESTful Uygunluk Orta Düşük Yüksek
URL Karmaşıklığı Yüksek (çok versiyon/kaynakta) Düşük Çok Düşük
Caching Etkisi Orta (versiyon farklı kaynak sayılır) Orta (parametre cache anahtarını etkiler) Yüksek (URL değişmez)
Gateway Uyumu İyi Orta Çok İyi
İstemci Unutma Riski Düşük Düşük Yüksek

Bu tablo, karar verme sürecinizde size bir rehber sunacaktır. Unutmayın ki, en iyi strateji, projenizin özel bağlamına en uygun olanıdır. Genel bir kural olarak, geniş kitlelere hitap eden ve uzun ömürlü olması beklenen API’ler için Custom Header Versioning’i tercih ediyorum. Daha küçük ölçekli veya iç projelerde ise URL Path Versioning de gayet yeterli olabiliyor.

Sonuç olarak, API versioning, yazılım geliştirmenin kaçınılmaz bir parçasıdır. Doğru stratejiyi seçmek, API’nizin gelecekteki gelişimini yönetmenizi kolaylaştırır, kullanıcılarınızın deneyimini iyileştirir ve operasyonel sorunları en aza indirir. Bu üç yöntemi anlamak ve trade-off’larını bilmek, bilinçli bir karar vermenize yardımcı olacaktır.

Paylaş:

Bu yazı faydalı oldu mu?

Yükleniyor...

Bu yazı nasıldı?

Sıkça Sorulanlar

Bu makale ile ilgili okurların sorduğu yaygın sorular.

API versioning için en uygun yaklaşımı nasıl seçebiliriz?
Ben kendi projelerimde, API versioning için en uygun yaklaşımı seçmek için önce projemin gereksinimlerini ve hedeflerini belirlerim. Örneğin, eğer bir kurumsal proje ise, geriye dönük uyumluluğu koruyarak yeni özellikler eklemek veya mevcutları değiştirmek kritik hale gelir. Bu nedenle, URL Path Versioning, Query Parameter Versioning veya Custom Header Versioning gibi farklı yöntemleri karşılaştırmak gerekir. Benim deneyimime göre, her bir yöntemin kendine has avantajları ve dezavantajları vardır ve hangisinin daha mantıklı olacağını belirlemek için gerçek dünya örneklerine ve projenin özel gereksinimlerine bakmak gerekir.
URL Path Versioning ile Query Parameter Versioning arasındaki temel fark nedir?
Benim deneyimime göre, URL Path Versioning ve Query Parameter Versioning arasındaki temel fark, versiyon bilgisinin nasıl iletildiği ile ilgilidir. URL Path Versioning'de, versiyon bilgisi URL'nin bir parçası olarak iletilir, örneğin /v1/kullanıcılar. Query Parameter Versioning'de ise, versiyon bilgisi sorgu parametresi olarak iletilir, örneğin ?version=1. Her iki yöntemin de avantajları ve dezavantajları vardır, ancak ben genellikle URL Path Versioning'i daha okunabilir ve anlaşılır bulurum.
API versioning sırasında hata oluşursa ne yapılmalıdır?
Eğer API versioning sırasında hata oluşursa, ben önce hatanın kaynağını belirlemeye çalışırım. Eğer hata, versiyon değişikliğinden kaynaklanıyorsa, eski versiyonu geri yüklemek veya yeni versiyonu geçici olarak devre dışı bırakmak gibi önlemler alınabilir. Ayrıca, kullanıcıları uyarmak ve kontrollü geçiş sağlamak için API versioning stratejisi belirlemek önemlidir. Benim deneyimime göre, proaktif iletişim ve yönetim, API versioning sırasında oluşabilecek hataları en aza indirmek için kritik öneme sahiptir.
Custom Header Versioning, diğer API versioning yöntemlerine göre daha mı avantajlıdır?
Benim deneyimime göre, Custom Header Versioning, diğer API versioning yöntemlerine göre bazı avantajlara sahiptir. Örneğin, Custom Header Versioning ile versiyon bilgisi URL veya sorgu parametresine dahil edilmeden iletilir, bu da daha esnek ve ölçeklenebilir bir yaklaşım sağlar. Ancak, Custom Header Versioning'in de kendi dezavantajları vardır, örneğin, bazı istemciler veya ara sunucular custom header'ları desteklemeyebilir. Ben genellikle, Custom Header Versioning'i diğer yöntemlerle birlikte kullanarak en好的 sonuçları elde etmeye çalışırım.
ME

Mustafa Erbay

Sistem Mimarisi · Network Uzmanı · Altyapı, Güvenlik ve Yazılım

2006'dan bu yana sistem mimarisi, network, sunucu altyapıları, büyük yapıların kurulumu, yazılım ve sistem güvenliği ekseninde çalışıyorum. Bu blogda sahada karşılığı olan teknik deneyimlerimi paylaşıyorum.

Kişisel Notlar

Bu notlar sadece sizde saklanır. Tarayıcınızda yerel olarak tutulur.

Hazır 0 karakter

Yorumlar

Sunucu Taraflı AI Moderasyon

Yorumlar sunucuda yapay zeka ile denetlenir ve kalıcı olarak saklanır.

?
0/2000

Sunucu taraflı AI denetim

✉️ Ücretsiz · Spam yok · İstediğin an çık

Yeni yazılardan haberdar olun

Yeni içerikler ve teknik notlar e-postanıza gelsin.

  • 📌
    Haftanın en iyisi Sadece okumaya değer tek yazı
  • 🔧
    Alet çantası Bu hafta kullandığım araçlar
  • 🧠
    Perde arkası Blog'a girmeyen notlar

Spam yapmıyoruz. İstediğiniz zaman ayrılabilirsiniz. · Sadece Umami (self-hosted, Google yok) ile takip.

Okuma İstatistikleriniz

0

Yazı Okundu

0dk

Okuma Süresi

0

Gün Serisi

-

Favori Kategori

İlgili Yazılar