Nelle applicazioni web moderne, è frequente consumare web api di terze parti per ottenere dati o compiere delle elaborazioni. Per inviare richieste web con C# siamo ormai abituati a usare la classe HttpClient e, a partire da ASP.NET Core 2.1, arriva a supporto anche il servizio IHttpClientFactory che apre scenari interessanti:
- Lo usiamo per ottenere un'istanza preconfigurata di HttpClient;
- Ci permette di centralizzare la configurazione, da cui indichiamo l'URL base o le intestazioni da aggiungere a ogni richiesta in uscita;
- Permette di creare una vera e propria pipeline di message handler, ovvero dei componenti che possono agire su ogni richiesta in uscita per operare strategie di retry, logging, gestione degli errori e così via;
- Gestisce il ciclo di vita dei vari message handler e perciò riesce a ottimizzare l'uso delle risorse avvalendosi di un pool;
- Si integra con la dependency injection di ASP.NET Core, permettendoci di usarla nei message handler.
Vediamo come sia semplice beneficiare di tutte queste potenzialità.
Iniziare con IHttpClientFactory
Dal metodo ConfigureServices della classe Startup possiamo configurare le impostazioni predefinite di ogni istanza di HttpClient, come l'URL base della web api o le intestazioni della richiesta. Per farlo, usiamo l'extension method AddHttpClient come nel seguente esempio.services.AddHttpClient("RemoteWebApi", client => { //Qui configuriamo l'istanza di HttpClient client.BaseAddress = new Uri("https://example.com/api/"); client.DefaultRequestHeaders.Add("Authorization", "ApiKey valore"); });
Come possiamo notare, a questa configurazione abbiamo dato il nome "RemoteWebApi" e ciò significa che possiamo invocare l'extension method AddHttpClient più volte, fornendo nomi diversi, per aggiungere molteplici configurazioni. Questo si rivela particolarmente utile quando la nostra applicazione consuma più di una web api di terze parti.
Ora, dall'action di un controller di ASP.NET Core MVC possiamo usare il servizio IHttpClientFactory per ottenere un'istanza di HttpClient preparata con una specifica configurazione.
public async Task<IActionResult> Index([FromServices] IHttpClientFactory clientFactory) { //Creiamo un'istanza di HttpClient indicando il nome della configurazione using (HttpClient client = clientFactory.CreateClient("RemoteWebApi")) { //Usiamo il client per inviare una richiesta GET a https://example.com/api/customers //Il frammento "customers" si aggiunge al BaseAddress impostato su https://example.com/api/ var response = await client.GetStringAsync("customers"); //TODO: Qui elaboriamo il json ottenuto dalla web api di terze parti var viewModel = GetCustomersViewModel(response); //Mostriamo il risultato all'utente return View(viewModel); } }
Questo ci consente di ottenere istanze di HttpClient pronte all'uso, riducendo la quantità di codice necessaria a inviare una richiesta web.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Utilizzare l'attributo autofill del CSS
Utilizzare l'API del browser fetch
Introduzione alla security con GitHub
Usare Azure Application Gateway come reverse proxy per ASP.NET Core
Migrare un repository che contiene large file storage objects in GitHub
Track 1: @danardelean con #maui, #dotnet e #vs2022Track 2: @crad77 con #yarp: un reverse proxy in #aspnetcore Seguici live su #aspilive: https://aspit.co/devconf-22
Recuperare la data di creazione e ultima modifica di un record con Entity Framework Core e le temporal table di SQL Server
Migrare un progetto ASP.NET Core da .NET 6 a .NET 7
Impostare il forward degli header in un sito ASP.NET Core dietro a un reverse proxy
Gestire tipi complessi in query string grazie a IParsable in ASP.NET Core 7.0
Mostrare una preview durante l'upload di un'immagine in Blazor
Confronto tra moduli in Javascript: ES e commonJS
I più letti di oggi
- 3 metodi JavaScript che ogni applicazione web dovrebbe contenere - Parte 2
- Monitorare i server on-premises con Azure Arc
- Gestire server e pc on premise con Azure Arc
- Taggare la output cache in base al routing in ASP.NET Core
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!