Tüm .Net Client Projelerimizde Ortak Kullanabileceğimiz Bir API Client yazalım.
Selamlar,
Daha önceden bahsetmiştim böyle bir konuya girmek istediğimi.
Yeni gelen HttpClientFactory ile de beraber daha önceden yazmış olduğum Resilient Network Services serisinin daha kısasını ve güncellenmiş halini kütüphanelerin detayların da çok fazla boğumladan yeniden incelemek istiyorum.
Amacımız şu;
Bir ApiClient Standard kütüphanesi oluşturalım. Solution ne kadar Client projemiz var ise Xamarin, Web, Console, UWP, WPF farketmez hepsi bu kütüphane üzerinden network haberleşmelerini yapsın(Http üzerinden)
Bu işlem sırasında da önceki yazılarımızda kullandığımız refit ve polly hatta akavache yi de kullanalım. ModernHttpClient a artık çok gerek yok, çünkü proje özelliklerinden Default mu yoksa platform spesifik sınıflarımı kullanmak istediğimizi zaten belirtebiliyoruz aşağıdaki gibi.
Burada HttpClient implementation ın Managed mı Default mu yoksa Android mi olduğunu seçebiliyoruz. iOS tarafında da durum aynı şekilde.
Peki çok uzatmadan bu kütüphanemizi yazmaya başlayalım ve Asp.Net Core Web App ve Xamarin projelerimizde de kullanalım bakalım.
Bir adet boş solution açıp içerisine önce bir adet Asp.Net Core Web App ve bir adet de xamarin.forms projeleri ekleyelim.
Daha sonra Add New Project diyerek Bir adet .netstandard class library ekleyelim.
Bu kütüphanenin diğer tüm client projeleri tarafından kullanılabileceğine eminiz çünkü .netstandard kütüphanesi ekledik.
Projede kullanmak istediğimiz ve resilient network services kısmında bize yardımcı olacak 3 temel şey var.
- Polly
- Refit
- HttpClientFactory
Tüm bunların kullanımı için öncelikle aşağıdaki paketleri projeye teker teker ekliyoruz.
- Microsoft.Extensions.DependencyInjection
- Microsoft.Extensions.Http.Polly
- Refit.HttpClientFactory
- Xamarin.Essentials (xamarin tarafında kullanmak üzere şimdilik çok önemi yok)
Projede kullanmak için bir api yazmaktansa yine open apilardan randomuser kullanalım.
Bunun için daha önceki yazılarımda çokça detayına girdiğim için burada konuyu uzatmadan hemen refit interface imi oluşturucam. Sonrasında da örnek bir tane delegating Handler oluşturucam
Bunlar aşağıdaki gibi;
Random user api si ile haberleşecek olan Refit Interface i;
Projede Endpoints adında bir klasör açıp içerisine aşağıdaki interface i atıyorum
Burada amaç tüm farklı endpointleri ayrı ayrı interfaceler altında toplayıp hepsini ayrı ayrı konfigüre edebilmek.
[Headers("Content-Type : application-json")] public interface IRandomUserApi { [Get("/")] Task<string> GetUser(string results); }
DelegatingHandler ım.
public class AuthTokenHandler : DelegatingHandler { private readonly string _token; private const string TOKEN = "Authorization"; public AuthTokenHandler(string token) { _token = token; } protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { if (!request.Headers.Contains(TOKEN) && string.IsNullOrEmpty(_token)) { return new HttpResponseMessage(HttpStatusCode.BadRequest) { Content = new StringContent("Missing auth token.") }; } else if (!request.Headers.Contains(TOKEN) && !string.IsNullOrEmpty(_token)) { request.Headers.Add(TOKEN, $"Bearer {_token}"); } var response = await base.SendAsync(request, cancellationToken); return response; } }
Bu iki kod bloğu ile ilgili daha detaylara girmek isterseniz aşağıdaki yazılarımı okuyabilirsiniz.
Projenin temel kısımları hazır oldu. Bundan sonraki yazımda asıl sınıfımız olan ApiClient sınıfını yazıp client projelerimizde kullanacağız.
Bir sonraki yazımda görüşmek üzere.