DEV Community

MustafaSamedYeyin
MustafaSamedYeyin

Posted on

Asp.net core Http Request, Named HttpClient Factories Giriş.

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");
            });
Enter fullscreen mode Exit fullscreen mode

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

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.";
            }
        }
    }
Enter fullscreen mode Exit fullscreen mode

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>();

Enter fullscreen mode Exit fullscreen mode

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();
        }
Enter fullscreen mode Exit fullscreen mode

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;
Enter fullscreen mode Exit fullscreen mode

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

NamedWeatherForecastService weatherForecastService
Enter fullscreen mode Exit fullscreen mode

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

_weatherForecastService = weatherForecastService;
Enter fullscreen mode Exit fullscreen mode

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

ViewBag.Bag = await _weatherForecastService.GetWeatherForecast();
Enter fullscreen mode Exit fullscreen mode

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();
        }
.
.
.
Enter fullscreen mode Exit fullscreen mode

9.) View/Home içerisindeki Index.cshtml'e gidelim. Ve Aşağıdaki kodu Index.cshtml'e yapıştıralım :

@ViewBag.Bag
Enter fullscreen mode Exit fullscreen mode

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

Image description

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/
Enter fullscreen mode Exit fullscreen mode

Sonuç :

Image description

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.

Discussion (0)