Asp.net core Http Request, Named HttpClient Factories Giriş.
Tags: dotnet, csharp
Published: 2021-10-18 12:28:21

Eğer HttpClient'ımıza isim vermek ve merkezi bir şekilde BaseAddress gibi özelliklerini yönetmek istersek "Named HttpClient Factories" adlı yöntemi izleyebiliriz.

Atacağımız adımlar : 

1.) Boş bir solution yaratın.
2.) Solution içerisine model-view-controller projesi yaratın.

Model-view-controller'ın launchSettings.json'daki applicationUrl'sini aşağıdaki gibi değiştirelim :
"applicationUrl": "https://localhost:5003;http://localhost:5002"

3.) Solution içerisine api projesi yaratın.
4.) Mvc projesinde Startup.cs'nin ConfigureService'ine aşağıdaki kodları ekleyelim : 
```
services.AddHttpClient("namedHavaDurumu", c =>
            {
                c.BaseAddress = new Uri("https://localhost:5001");
                c.DefaultRequestHeaders.Add("Accept", "application/json");
            });
```
Açıklama : HttpClient'ımıza "namedHavaDurumu" ismini verdik. Baseadress'ini "https://localhost:5001" yaptık ve header'ını json olarak kabul ettirdik.

5.) Mvc projesinin içirisine Service adlı bir klasör oluşturun ve içine NamedWeatherForecastService.cs adlı class'ı yaratın : 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0i3skbxhexmoy4cj8exc.png)
 
6.) NamedWeatherForecastService.cs adlı class'ımızı aşağıdaki gibi değiştirelim : 

```
public class NamedWeatherForecastService
    {
        private readonly IHttpClientFactory _httpClient; 
        public NamedWeatherForecastService(IHttpClientFactory httpClient)
        {
            _httpClient = httpClient;
        }
        public async Task<string> GetWeatherForecast()
        {

            var response = await _httpClient.CreateClient("namedHavaDurumu")
                .GetAsync("/WeatherForecast");

            if (response.IsSuccessStatusCode)
            {
                return await response.Content.ReadAsStringAsync();
            }
            else
            {
                return "Yanlış bir şeyler oldu.";
            }
        }
    }
```
Açıklama : Gördüğünüz üzere 4. adımdaki .AddHttpClient("namedHavaDurumu",...)'a verdiğimiz isim ile 6. adımda _httpClient.CreateClient("namedHavaDurumu") verdiğimiz isim aynı.

7.) Mvc projesinde Startup.cs'deki ConfigureService adlı metodumuza aşağıdaki servisleri ekleyelim : 

```
        services.AddScoped<NamedWeatherForecastService>();

```

Burası her gelen istekte "NamedWeatherForecastService" adlı class'ı gördüğünde bize yeni "NamedWeatherForecastService"  verecek demektir.
Startup.cs içerisinde ConfigureServices metodumuz aşağıdaki gibi gözükmelidir : 

```
public void ConfigureServices(IServiceCollection services)
        {
            
            services.AddHttpClient("namedHavaDurumu", c =>
            {
                c.BaseAddress = new Uri("https://localhost:5001");
                c.DefaultRequestHeaders.Add("Accept", "application/json");
            });
           
            services.AddScoped<NamedWeatherForecastService>();

            services.AddControllersWithViews();
        }
```

8.) Mvc projesinde HomeController.cs içerisinde aşağıdaki gibi değişiklikler yapalım :

a.)  Class'ın içerisine aşağıdaki kodları yazalım : 

```
private readonly NamedWeatherForecastService _weatherForecastService;
```

b.) Constructor'ın parametresine aşağıdaki parametreyi verelim : 

```
NamedWeatherForecastService weatherForecastService
```

c.) Constructor'ın içine şu kodları yazalım : 

```
_weatherForecastService = weatherForecastService;
```

d.) Index action'ının içine :

```
ViewBag.Bag = await _weatherForecastService.GetWeatherForecast();
```

yazalım.

Not : Total'de HomeController aşağıdakine benzer olmalıdır.

```
public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;
        private readonly NamedWeatherForecastService _weatherForecastService;
        public HomeController(ILogger<HomeController> logger, NamedWeatherForecastService weatherForecastService)
        {
            _logger = logger;
            _weatherForecastService = weatherForecastService;
        }

        public async Task<IActionResult> Index()
        {
            ViewBag.Bag = await _weatherForecastService.GetWeatherForecast();
            return View();
        }
.
.
.
```
9.) View/Home içerisindeki Index.cshtml'e gidelim. Ve Aşağıdaki kodu Index.cshtml'e yapıştıralım : 

```
@ViewBag.Bag
```

Total'de Index.cshtml aşağıdakine benzemelidir : 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oo04l8y90299ndtf6jrh.png)
 
10.) Api uygulamızı "dotnet run" ile çalıştıralım.

11.) Mvc uygulamızı "dotnet run" ile çalıştıralım.

12.) Aşağıdaki url'yi browser'ımızıda açalım: 

```
https://localhost:5003/
```

Sonuç : 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wrhsjwdo8zbnd173ri1x.png)


Gördüğünüz üzere data'larımızı görebildik.

Bir dahaki yazımda "Typed HttpClient Factories"i anlatmaya çalışacağım.

Bir dahaki yazımda görüşmek dileğiyle.

En iyi dileklerim ile.

Mustafa Samed Yeyin.