Merhabalar arkadaşlar,
bugun sizlere .net core httpclient üzerinde bestpractice’ler üzerinde bilgi veriyor olacağım. Buradaki ifadeler .net core iletişim kurduğu yapıların temelde webapi üzerinde gerçekleştirdiği ve güzel sonuçlar elde edilen konular üzerinde olacaktır.
Ayrıca verilen örnekler c# üzerinde olduğunu belirtmek isterim.
Öncelikle şunu bilmemiz gerekir ki httpclient hafızadan atılan IDisposable sınıfından türetildiği ve bu işlemin her seferinde tekrar oluşturma maaliyetleri çok olacağı için;
HttpClientFactory ile HttpClient örneklemlerinin yapılması;
Yukarda da bahsettiğim temel problemden dolayı httpclientfactory kullanılmaktadır. Temelde httpclient sistemde bağlantı yapıldığı zaman ve bağlantının sistemden atıldığı zaman httpclienthandler kullanılarak işlemlerini yapmaktadır.
httpclienthandler ile sistemden atılması gereken bağlantılar atılmadığı zaman bu problem ortadan kalkmış gibi görünmektedir. Hal böyle olunca sistem içerisinde en temelde DNS değişimlerinden gelecek değişiklikleri httpclienthandler yakalayamadığı için sistemsel olarak yanlıklıklara neden olmaktadır. İşte tam bu noktada httpclientfactory devreye girmektedir.
Yine sistemde açılan connectionlar belirli bir süre(2dk) içerisinde hafızadan atılması işlemi gerçekleştirir fakat httpclientfactory ile httpclientfandler havuzundan bir connection alarak kullanımana devam etmektedir. Hal böyle olunca havuzdan kullanılan connection ile sistem bir nebze rahatlamaktadr.
httpclientfactory’in bir kaç kullanım ıvardır. bunlardan genelde ençok tercih edileni(ben etmiyorum) direk servis olarak eklendikten sonra ilgili conroller’ın action’ı içerisinde
private readonly IHttpClientFactory _httpClientFactory;
public ProductsController(IHttpClientFactory httpClientFactory)
{
_httpClientFactory = httpClientFactory;
}
[HttpGet]
public async Task<ActionResult> Get()
{
var client = _httpClientFactory.CreateClient();
client.BaseAddress = new Uri(“https://api.xyz.com”);
string result = await client.GetStringAsync(“/”);
return Ok(result);
}
gibi
Contenttype Mine türlerinin düzenlenmesi
Yaptığınız projelerin dönüş tiplerini /başlıkta kabul edilen tipleri mümkün mertebe belirtiniz ki gelecek verinin sistemin içerisinde yapılacak aksaklıkların önüne geçilmesidir. Örneğin application/json veri türünde istek kabul edilecek şeklinde bir bilgi ile sistemin daha stabil çalışmasını sağlıyor oluruz.
Bunun için projenizde;
var medaiType = new MediaTypeWithQualityHeaderValue(“application/json”);
client.DefaultRequetHeaders.Accept.Add(mediaType);
şeklinde ibare ile kulanıyor olursunuz. Ayrıca her istekta farklı yapılacak olursa onunla alakalı bilgiyi araştırmanızı tavsiye ederim 🙂
Ayrıca gelen verinin belirli bir ağaç mantığında okumanız sistemsel açıdan ve yazılımsal açıdan sizlere fayda sağlayacaktır. bunun için aşağıdaki örneği kullanıyor olabilirsiniz.
using(var stream = await response.Content.ReadAsStreamAsync())
{
using (var streamReader = new StreamReader(stream))
{
using (var jsonTextReader = new JsonTextReader(streamReader))
{
var products = new JsonSerializer().Deserialize<Customer>(jsonTextReader);}
}
}
Bunların yanı sıra httpclient üzerinden gelen yanıtlara
->success
->unauthorized
gibi yanıtların durumlarına bağlı iş adımları üretmeniz gerekmektedir.Nedeni şudur. belki token süreniz bitmiş belki kullanıcınız pasif olmuştur vs. gibi durumlara bağlı sistemden veri çekemiyorsunuz. veri almak istediğiniz yol sıkıntı vardır bilgi alınamıyor olabilir de olabilir. senaryoları üretebiliriz.
Gelen veri türüne göre işlemler yapoyor olabilirsiniz bunun için gelen verinin başlığına göre işlem adımları uygulayabiliriz.
var response = await client.SendAsync(request);
if (response.Content.Headers.ContentType.MediaType == “application/json”)
{
var json = await response.Content.ReadAsStringAsync();var products = JsonConvert.DeserializeObject<Producs>(json);
}
Son yıllarda verilerin artmasından dolayı gelecek cevabın verisi çok büyük olabilir. bu nedenle gönderilen verinin sıkıştırma yöntemi uygulanması gerektiğini düşünenlerdeniz.