.NET Core ile HTTP İstekleri Gerçekleştirmek - IHttpClientFactory

Bu yazımda .Net Core alt yapısında HttpClient nesnesinin pratik olarak kullanımına değineceğim. Özellikle third party API'lere istekte bulunurken kullanışlıdır. .NET Core platformunda  IHttpClientFactory interface'i register edilerek kullanılır. 

Uygulamalarımızda IHttpClientFactory'i farklı yöntemlerle kullanarak HttpClient nesnesini oluşturup kullanabiliriz. Yazıda, en pratik bulduğum iki yönteme değineceğim. 

  • Named Clients
Bu kullanımda HttpClient nesnesine farklı isimlendirmelerle (client name) oluşturup uygulamalarımızda çağırabiliriz. Uygulamaların farklı HttpClient nesnesine sahip olması gerektiğinde ve farklı yapılandırma ayarları varsa iyi seçim olabilir. 

public void ConfigureServices(IServiceCollection services)
{
services.AddHttpClient("v3", estClient =>
{
estClient.BaseAddress = new Uri("https://date.nager.at/api/v3/");
estClient.DefaultRequestHeaders.Accept
.Add(new MediaTypeWithQualityHeaderValue("application/json"));
});
services.AddHttpClient("v2", estClient =>
{
estClient.BaseAddress = new Uri("https://date.nager.at/api/v2/");
estClient.DefaultRequestHeaders.Accept
.Add(new MediaTypeWithQualityHeaderValue("application/json"));
});
}
view raw NamedClients.cs hosted with ❤ by GitHub
Yukarıdaki tanımlamada örnek bir API linkinde farklı versiyonlar için farklı isimlendirmelere sahip client oluşturuldu. ConfigureService metodunda AddHttpClient metodunun ilk parametresine (name) uygun isim verilir. CreateClient metodu kullanılarak oluşturulan isimlerden istediğimizi çağırabiliriz.
var httpClient = httpClientFactory.CreateClient("v3");
view raw CreateClient.cs hosted with ❤ by GitHub
  • Typed Clients
Bu kullanımda, Named Client ile oluşturduğumuz HttpClient nesneleri için ayrı sınıflar oluşturarak ayrım yapabiliriz. Dependency Injection prensibi ile kullanacağımız yerlerde enjekte edebiliriz. Ayrıca hard coded isimler kullanmak yerine tip şeklinde kullanmak kodumuzu temiz hale getirir. HttpClient yapılandırma ayarlarını tek bir yerden kontrol edebiliriz. Bu şekilde Startup.cs dosyasında kod kalabalığından kurtarabiliriz.

public class DateHttpClient
{
private HttpClient _httpClient { get; }
private IConfiguration _configuration { get; }
public DateHttpClient(HttpClient httpClient, IConfiguration configuration)
{
_httpClient = httpClient;
_configuration = configuration;
httpClient.BaseAddress = new Uri(_configuration.GetSection("DateApiInfo").GetSection("BaseUrl").Value);
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
}
}
Yukarıdaki tanımlamalarda DateHttpClient diye isimlendirdiğimiz bir client tipi oluşturduk. Constructorda BaseAdress ve DefaultRequestHeaders eklemesini yaptık. Bu tipi kullanmak için Startup.cs dosyasında tanımlama işlemini yapıyoruz. Transient olarak tanımlandı ve HttpClient verdiğimizde bize DateHttpClient tipinde bir nesne verecektir. (Depenency Injection Prensibi)

services.AddHttpClient<DateHttpClient>();
Kullanacağımız yerdeki constructorda aşağıdaki gibi enjekte ediyoruz. 
public class HolidayManager : IHolidayService
{
private DateHttpClient _dateHttpClient;
public HolidayManager(DateHttpClient dateHttpClient )
{
_dateHttpClient = dateHttpClient;
}
}

Yukarıda bahsettiğim iki yöntemde HttpClient nesnelerinin daha anlaşılır ve yönetiminin kolay olması için anlatıldı. 

Github'da bulunan örneğimizde ülke seçimi yapılır ve seçilen ülkeye ait resmi tatiller getirilir. Aşağıdaki API linki, resmi tatilleri ülke ve yıla göre getirmektedir. Konuyu anlatırken bu linkten faydalandım. Dokümantasyondan kullanımlarını inceleyebilirsiniz.  

Dokümantasyon: Swagger UI (nager.at)

Örneğimin Github Proje Linki için tıklayınız

Demo


Kaynaklar

Microsoft Blog Linki

API linki konusunda yararlandığım okuma




Yorumlar

Yorum Gönder