Nei precedenti due script abbiamo avuto modo di introdurre la nuova interfaccia IHttpClientFactory, che permette di configurare i servizi a cui la nostra applicazione dovrà accedere tramite HttpClient, e poi ottenere un client preconfigurato - magari anche con alcune policy di retry e timeout definite con Polly - quando ne abbiamo bisogno.
Sicuramente si tratta di uno strumento estremamente comodo, che però ha il difetto di richiedere comunque di effettuare manualmente l'encoding dei parametri, il parsing della risposta e, ovviamente di appoggiarsi a delle stringhe predefinite per indicare il client di cui abbiamo bisogno.
Grazie alla libreria Refit (https://github.com/reactiveui/refit) possiamo facilmente generare un client fortemente tipizzato per ogni endpoint REST di cui abbiamo bisogno. Il procedimento è piuttosto semplice. Dopo aver installato il package tramite NuGet
install-package Refit
non dobbiamo far altro che creare un'interfaccia simile alla seguente:
public interface IPeopleClient { [Get("/people")] Task<IEnumerable<Person>> GetPeopleAsync(); [Get("/people/{id}")] Task<Person> GetPersonAsync(string id); }
Si tratta semplicemente di scrivere la signature di ognuno degli endpoint che vogliamo invocare, e poi mapparla sul corrispondente URL tramite l'uso di attributi. Come possiamo notare dallo snippet in alto, è possibile anche specificare come i parametri del metodo C# concorrano alla definizione dell'indirizzo stesso.
Una volta creata l'interfaccia, possiamo configurare questo client in IHttpClientFactory, all'interno della classe Startup.
public void ConfigureServices(IServiceCollection services) { // ..altro codice qui.. services.AddHttpClient("people", c => { c.BaseAddress = new Uri("http://localhost:7252/api"); }) .AddTypedClient(c => RestService.For<IPeopleClient>(c)); // ..altro codice qui.. }
La prima porzione di configurazione, definita con AddHttpClient, è assolutamente analoga a quella che abbiamo visto in precedenza (https://www.aspitalia.com/script/1294/Ottimizzare-Codice-Richieste-HTTP-Tramite-IHttpClientFactory-ASP.NET-Core-2.1.aspx). La successiva chiamata ad AddTypedClient, invece, specifica che vogliamo usare Refit per generare il client a partire dall'interfaccia che abbiamo definito inizialmente.
Per utilizzare IPeopleClient è sufficiente richiederlo come dipendenza nel costruttore di un qualsiasi controller:
public class HomeController : Controller { private IPeopleClient _client; public HomeController(IPeopleClient client) { _client = client; } public async Task<IActionResult> Index() { var people = (await _client.GetPeopleAsync()).ToList(); var id = people.First().Id; var person = await _client.GetPerson(id); return View(); } }
Come possiamo notare, Refit risulta essere uno strumento estremamente comodissimo per realizzare facilmente dei client fortemente tipizzati per i servizi che invochiamo, scrivendo pochissimo codice.
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'API del browser fetch
GitHub Actions e Terraform: l'infrastruttura, dalla definizione al deploy
Taggare la output cache in base al routing in ASP.NET Core
Gestire tipi complessi in query string grazie a IParsable in ASP.NET Core 7.0
Q# for Quantum Programming, an "only for the brave" session
Produttività con ASP.NET Core 6
Creare automaticamente una pipeline YAML da una sua definizione in Azure DevOps
Linting di un Dockerfile con un workflow di GitHub
Sfruttare la local cache del browser tramite gli ETag in ASP.NET Core
Condividere i workflow tra più repository in GitHub
Leggere i dati di configurazione di ASP.NET Core da Azure Key Vault
I più letti di oggi
- DateOnly e TimeOnly in .NET: e io che ci faccio?
- .NET 7 Live Q&A
- Catturare la telemetria degli eventi di output cache in ASP.NET Core
- Nasce DOpsItalia.com: tutto su DevOps e container https://aspit.co/bw3 di @dbochicchio #aspitalia
- il 15/12 torna #netconfit per festeggiare il lancio di #dotnet7.una track live a Milano e 2 in streaming, per un evento ibrido da non perdere!iscrizioni e call for paper su => https://aspit.co/netconf-22
- Utilizzare la modalità serverless con Azure Cosmos DB
- Abilitare automaticamente Dependabot in tutti i repository di una organizzazione su GitHub
- Community Days 'Tour Edition' 2010 - Segrate (MI)
- Rilasciata la preview 1 di ASP.NET AJAX 4.0
- Nuova versione per jQuery e prima alpha per jQuery Mobile