Basit Bir Rest Api Client Geliştirelim 7

2023-05-12 | #diy-rest-api-client #do-it-yourself #net #rest-api

Birkaç özelleştirilebilir başlık ayarlama yeteneği ekleyelim. Bu özellik, belirli bir istek için özel HTTP başlıkları ayarlamayı kolaylaştıracaktır. using Newtonsoft.Json; using Polly; using Polly.Caching; using Polly.Caching.Memory; using Polly.Registry; using System; using System.Collections.Generic; using System.Net.Http; using System.Text; using System.Threading.Tasks; using Microsoft.Extensions.Logging; public class MyHttpClient : IDisposable { private readonly HttpClient _client; private readonly IPolicyRegistry<string> _policyRegistry; private readonly ILogger<MyHttpClient> _logger; public MyHttpClient(HttpClient client, IPolicyRegistry<string> policyRegistry, ILogger<MyHttpClient> logger, string baseAddress, TimeSpan? timeout = null, HttpMessageHandler handler = null) { _client = handler == null ?

Devamı 


Basit Bir Rest Api Client Geliştirelim 6

2023-05-12 | #diy-rest-api-client #do-it-yourself #net #rest-api

HTTP yanıtının durum kodlarını kontrol edebilme yeteneğini ekleyelim. Bu özellik, HTTP isteğinin başarılı olup olmadığını veya belirli bir hata durumunu gösterip göstermediğini belirlememize olanak sağlar. using Polly; using Polly.Caching; using Polly.Caching.Memory; using Polly.Registry; using System; using System.Collections.Generic; using System.Net.Http; using System.Text; using System.Threading.Tasks; using Microsoft.Extensions.Logging; public class MyHttpClient : IDisposable { private readonly HttpClient _client; private readonly IPolicyRegistry<string> _policyRegistry; private readonly ILogger<MyHttpClient> _logger; public MyHttpClient(HttpClient client, IPolicyRegistry<string> policyRegistry, ILogger<MyHttpClient> logger, string baseAddress, TimeSpan?

Devamı 


Basit Bir Rest Api Client Geliştirelim 5

2023-05-12 | #diy-rest-api-client #do-it-yourself #net #rest-api

Daha fazla işlevsellik eklemek için, hata günlüğü ve otomatik hata izleme ekleyebiliriz. Bu, hataların daha kolay izlenmesine ve işlenmesine olanak sağlar. Bunun için, ILogger arabirimi kullanılarak hataların kaydedilmesini sağlayabiliriz. using Polly; using Polly.Caching; using Polly.Caching.Memory; using Polly.Registry; using System; using System.Collections.Generic; using System.Net.Http; using System.Text; using System.Threading.Tasks; using Microsoft.Extensions.Logging; public class MyHttpClient : IDisposable { private readonly HttpClient _client; private readonly IPolicyRegistry<string> _policyRegistry; private readonly ILogger<MyHttpClient> _logger; public MyHttpClient(HttpClient client, IPolicyRegistry<string> policyRegistry, ILogger<MyHttpClient> logger, string baseAddress, TimeSpan?

Devamı 


Basit Bir Rest Api Client Geliştirelim 4

2023-05-12 | #diy-rest-api-client #do-it-yourself #net #rest-api

Bir sonraki adımda, HTTP istemci sınıfımızda önbellekleme ve otomatik yeniden deneme gibi özellikler ekleyebiliriz. Bu özellikler, API isteklerini daha verimli ve dayanıklı hale getirir. Bu geliştirmeleri yapmak için, Polly adlı bir kütüphaneyi kullanacağız. using Polly; using Polly.Caching; using Polly.Caching.Memory; using Polly.Registry; using System; using System.Collections.Generic; using System.Net.Http; using System.Text; using System.Threading.Tasks; public class MyHttpClient : IDisposable { private readonly HttpClient _client; private readonly IPolicyRegistry<string> _policyRegistry; public MyHttpClient(HttpClient client, IPolicyRegistry<string> policyRegistry, string baseAddress, TimeSpan?

Devamı 


Basit Bir Rest Api Client Geliştirelim 3

2023-05-12 | #diy-rest-api-client #do-it-yourself #net #rest-api

Geliştirme vakti BaseAddress özelliği, zaman aşımı süresini ayarlamak ve özelleştirilebilir bir HttpMessageHandler ekleyelim. Ayrıca, bu sınıf artık bir Authorization header ı alabilsin. using System; using System.Collections.Generic; using System.Net.Http; using System.Text; using System.Threading.Tasks; public class MyHttpClient : IDisposable { private readonly HttpClient _client; public MyHttpClient(HttpClient client, string baseAddress, TimeSpan? timeout = null, HttpMessageHandler handler = null) { _client = handler == null ? client : new HttpClient(handler); _client.BaseAddress = new Uri(baseAddress); if (timeout.

Devamı 


Basit Bir Rest Api Client Geliştirelim 2

2023-05-12 | #diy-rest-api-client #do-it-yourself #net #rest-api

Bu versiyonda, bir dizi başlık bilgisi, özelleştirilmiş zaman aşımı süresi ve daha fazla hata kontrolü ekleyelim: using System; using System.Collections.Generic; using System.Net.Http; using System.Text; using System.Threading.Tasks; public class MyHttpClient : IDisposable { private readonly HttpClient _client; public MyHttpClient(TimeSpan? timeout = null) { _client = new HttpClient(); if (timeout.HasValue) { _client.Timeout = timeout.Value; } } private HttpRequestMessage CreateRequest(string uri, HttpMethod method, string jsonData = null, Dictionary<string, string> headers = null) { var request = new HttpRequestMessage(method, uri); if (headers !

Devamı 


Basit Bir Mock Framework Geliştirelim 6

2023-05-11 | #diy-mocking-framework #do-it-yourself #mock #net #reflection

Şimdiye kadar, mock nesnesinin belirli bir metodu çağırıldığında belirli bir sonuç döndürmesini, bir dizi sonuç döndürmesini veya bir hata fırlatmasını ayarlayabiliyoruz. Ancak, bazen bir metodu çağırıldığında belirli bir eylemi gerçekleştirmesini isteyebiliriz. Bu, genellikle “Callback” olarak adlandırılır. Bu özellik, bir metot çağrıldığında gerçekleşecek bir eylemi ayarlamak için kullanılabilir. Bu eylem, bir metot çağrıldığında herhangi bir işlemi gerçekleştirebilir. Örneğin, bir metot çağrıldığında belirli bir değişkenin değerini artırabiliriz, ya da belirli bir başka metodu çağırabiliriz.

Devamı 


Basit Bir Mock Framework Geliştirelim 5

2023-05-11 | #diy-mocking-framework #do-it-yourself #mock #net #reflection

Şu anda, bizim Mock sınıfımızda bir metodun belirli bir sonucu döndürmesini veya bir dizi sonuç döndürmesini ayarlayabiliyoruz. Ancak, belirli bir durumda bir metot çağrıldığında bir hata fırlatmasını isteyebiliriz. Bu, genellikle “Throws” olarak adlandırılır. using System; using System.Collections.Concurrent; using System.Linq.Expressions; using System.Reflection; using System.Collections.Generic; public class Mock<T> : DispatchProxy { private ConcurrentDictionary<string, object> _methodResponses = new(); private ConcurrentDictionary<string, Queue<object>> _methodSequences = new(); private ConcurrentDictionary<string, Exception> _methodExceptions = new(); private ConcurrentDictionary<string, int> _methodCalls = new(); protected override object Invoke(MethodInfo targetMethod, object[] args) { var key = GetKey(targetMethod, args); var wildcardKey = $"{targetMethod.

Devamı 


Basit Bir Mock Framework Geliştirelim 4

2023-05-11 | #diy-mocking-framework #do-it-yourself #mock #net #reflection

Mocklama kütüphanemizi daha da geliştirelim. Şu anda, bir metodun belirli parametrelerle çağrılmasını ve belirli bir sonuç döndürmesini bekliyoruz. Ancak, bazen belirli bir parametre türüne sahip bir metodu çağrıldığında belirli bir sonuç döndürmesini isteyebiliriz, parametrenin kendisinin ne olduğu önemli olmayabilir. Bu özellik, genellikle mocklama kütüphanelerinde “It.IsAny” olarak adlandırılır. Ayrıca, bir mock nesnesinin bir metodu birden fazla kez çağrıldığında farklı sonuçlar döndürmesini isteyebiliriz. Bu, genellikle “SetupSequence” olarak adlandırılır. Bu iki özelliği ekleyelim.

Devamı 


Basit Bir Mock Framework Geliştirelim 3

2023-05-11 | #diy-mocking-framework #do-it-yourself #mock #net #reflection

Bu sefer belirli parametrelerle çağrılan metotları simüle edeceğiz ve geri dönüş değerini ayarlayabileceğiz. Ayrıca, belirli bir metot çağrısını doğrulayabileceğiz. using System; using System.Collections.Concurrent; using System.Linq.Expressions; using System.Reflection; public class Mock<T> : DispatchProxy { private ConcurrentDictionary<string, object> _methodResponses = new(); private ConcurrentDictionary<string, int> _methodCalls = new(); protected override object Invoke(MethodInfo targetMethod, object[] args) { var key = GetKey(targetMethod, args); if (_methodResponses.TryGetValue(key, out var value)) { if (_methodCalls.ContainsKey(key)) { _methodCalls[key]++; } else { _methodCalls.

Devamı 