Asp.Net Core HttpClientFactory + Refit
Selamlar,
Son birkaç yazıdır üzerinde durduğum HttpClientFactory ile sevdiğim ve sıkça kullandığımı kütüphanelerden biri olan Refit in beraber kullanımı hakkında yazmak istedim.
Daha önceki konu ile alakalı yazılarıma aşağıdaki linklerden ulaşabilirsiniz.
- Asp.Net Core 2.1 İle Gelen HttpClientFactory ve HttpClient İle Kıyaslama.
- Asp.Net Core da HttpClientFactory Kullanımı (Basic Usage)
- Asp.Net Core da HttpClientFactory Kullanımı (Named and Typed Clients)
- Resilient Network Services Bölüm 2 – REFIT
- Resilient Network Services Bölüm 2 – REFIT – 2
Refit daha önce kullanmadıysanız hemen kullanmaya başlamanız için çok sebep var. Detaylarına girmeyeğim, önceki yazılarda değinmiştim, ama özetle söyleyebilirimki bir enpoint ile yapacağınız tüm haberleşmeyi tek bir interface üzerinde hazırlayıp geri kalanını refit e bırakıyorsunuz. O da size runtime bu interface nizin canlı ve çalışan bir halini sunuyor.
Refit ile;
- Get,Post,Put,Delete .. her HttpVerb e karşılık gelen metodlar oluşturabilirsiniz
- Querystring, dynamic url parameter s gibi birçok şekilde get request i atabilirsiniz
- json ve formurlencoded gibi birçok farklı serialization yöntemi ile post lar yapabilirsiniz
- multipart upload lar yapabilirsiniz
- static veya dynamic header ları kolayca request lerinize ekleyebilirsiniz
ve daha nicesi..
Aşağıdaki basit bir refit interface i görüyoruz. Bu interface e baktığımız da şunu anlıyoruz.
Relative url i olmayan bir endpoint e GET request i atılacak string olarak results adında bir querystring parametresi geçilecek. Geriyede string bir result dönecek. Gidecek olan request e de Content-Type : application/json header ı eklenecek.
namespace HttpClientFactoryRefit { [Headers("Content-Type : application-json")] public interface IRandomUserApi { [Get("/")] Task<string> GetUser(string results); } }
Peki daha önceden 3 farklı yöntem de HttpClientFactory Kullanımı görmüştük. Hatta Typed Client kullanırken tam olmasada benzer bir şekilde Client sınıfımızı ayrıca yazmıştık. Peki Elimizde varolan bir proje var diyelim, önceden de refit kullanmıştık. Ama artık HttpClientFactoryde kullanmak istiyoruz dersek ne yapacağız.
Sadece projemize nugetten
Refit.HttpClientFactory paketini indirdikten sonra, Startup dosyamızdaki ConfigureServices metodunda aşağıdaki şekilde tanımlamamızı yapabiliriz.
Tek fark önceden olduğu gibi AddHttpClien değil, artık AddRefitClient metodunu kullanıyo olmamız. Bu extension metod, yukarıdaki paketi indirdiğimizde gelecek.
public void ConfigureServices(IServiceCollection services) { services.Configure(options => { // This lambda determines whether user consent for non-essential cookies is needed for a given request. options.CheckConsentNeeded = context => true; options.MinimumSameSitePolicy = SameSiteMode.None; }); services.AddRefitClient() .ConfigureHttpClient(client => { client.BaseAddress = new Uri("https://randomuser.me/api"); }); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); }
Peki kullanımı nasıl?
Kullanımının TypedClient kullanımından hiçbir farklı yok. Refit interface imizi sanki bir TypedClient mış gibi Controller ımızda tanımlıyoruz, ve constructor de bize inject edilecek olan interface olarak atamamızı yaptıktan sonra, dosya içerisinde istediğimiz yerde interface içerisinden yazdığımız istediğimiz metodu kolayca çağırıyoruz.
public class HomeController : Controller { private readonly IRandomUserApi _randomUserApi; public HomeController(IRandomUserApi randomUserApi) { _randomUserApi = randomUserApi; } public async Task Index() { var result = await _randomUserApi.GetUser("10"); return View(); } ....
Bu kadar basit. Zaten refit kullandığınız ama HttpClientFactory e geçmediyseniz kodlarınızda çok az değişiklik yaparak kullanmaya başlayabilirsiniz.
Yeni başlayacağınız projelerde her ikisinide kullanmanızı öneririm.
Bir sonraki yazımda görüşmek üzere.