API geliştirip yayınladıktan sonra iyileştirme veya ek özellik eklenmesi için çalışma yapılabilir. Bu çalışmalar köklü bir hale geliyorsa API versiyonlama konusu ile sürüm oluşturma çözümüne gidebiliriz.
Başlıca API versiyon oluşturulabilecek nedenler;
- Müşterinin talepleri, mevcut yapıda değişiklik yapmayı gerektiriyorsa,
- Teknoloji (veri tabanı veya ek kütüphane kullanımı) veya mimari (monolitikten mikroservise geçiş) değişiklikler uygulandıysa,
- Bilgilendirme ve değişikliklerin takibi (Hangi versiyonda ne gibi özelliklerin geldiği)
- Media Type değişiklikleri (json, formdata, xml vb.)
HTTP Header
X-API-Version: 1.0
Url
Query String
Nuget Linki: Microsoft.AspNetCore.Mvc.Versioning
Bu projenin dokümantasyonu, incelediğim kadarıyla güzel bir kaynaktır. İncelemek için buraya tıklayabilirsiniz.
builder.Services.AddApiVersioning();
new Microsoft.AspNetCore.Mvc.ApiVersion(1, 0);
Desteklenmeyen API versiyonu için: api-deprecated-versions: 1.0
[ApiVersion("1.0",Deprecated =true)]
- options.ApiVersionReader = new QueryStringApiVersionReader("api-version");
- options.ApiVersionReader = new HeaderApiVersionReader("X-API-Version");
Parametre olarak aldıkları değerler, parametrenin isimleridir. İstediğimiz isimlendirmeyi yapabiliriz.
Projede controller tarafında versiyona göre klasörlere ayrıldı. Düzenli olması adına tavsiye ediyorum. Gelin controller sınıflarının detaylarını inceleyelim.
ProductController version 1 için ApiVersion değeri "1.0" tanımlandı.
ProductController version 2 için ApiVersion değeri "2.0" tanımlandı.
Controllerda herhangi bir metodu farklı bir versiyona da bağlayabiliriz. V2 için oluşturduğum ProductsController sınıfında ApiVersion değeri "3.0" olarak tanımlandı. Versiyon 3 te çalışacak GetAllProductsV3 metodunun üzerinde MapToApiVersion değeri 3.0 olarak ayarlandı. Bunun anlamı versiyon bilgisi 3.0 gönderildiğinde GetAllProductsV3 metot çalışacaktır. Aynı sınıftan versiyon bağlama örneğini görmüş olduk.
Örnekte üç versiyon arasındaki en önemli senaryo farkı, v1.0 da GetAllProducts metodu bütün ürünleri getirirken, v2.0 da bu metot sadece 3 tane ürün getirecektir. v3.0 da ise 10 adet ürün getirecektir. Bu istekleri makalenin başında belirttiğim 3 versiyon teknikleriyle uygulanmasını görelim.
Http Header
Bu teknik için Postman üzerinden çıktıyı görelim. Projede ApiVersionReader değerini HeaderApiVersionReader ile tanımlayalım ve ismine "X-API-Version" verelim. Postman'de header verirken bu ismi kullanacağız.
Query String
Projede ApiVersionReader değerine bir atama yapmadığımızda varsayılan olarak çalışan teknik olduğundan bahsetmiştim. Endpoint sonrasına verilen query stringde versiyon bilgisi, 2.0 olarak aşağıdaki şekilde verildi.
Url[Route("api/v{version:apiVersion}/[controller]")]
Gönderdiğimiz versiyona göre eşleşen controller sınıfına istek gönderir. Örnekte versiyon 2 için url şemasına aşağıdaki gibi gönderim yapıldı.
https://localhost:44396/api/v2/products
Bu makalenin sonuna gelirken; Api versiyonlama sebeplerini anlayıp, url, header ve query string yöntemleriyle versiyonlamayı inceledikten sonra .NET 6 Web API projesinde uygulanmasını görmüş olduk.
Yorumlar
Yorum Gönder