Client REST con Refit in ASP.NET Core

Scopri come utilizzare Refit per ridurre codice dei servizi REST, migliorando la produttività nello sviluppo delle applicazioni.

Nello sviluppo di applicazioni moderne, effettuare chiamate HTTP ad API esterne è un requisito comune, ma a volte tedioso. Spesso, gli sviluppatori si trovano ad affrontare codice ripetuto durante la configurazione dei client HTTP, l’analisi delle risposte e a la gestione degli errori. Refit, una libreria REST per .NET, affronta queste sfide direttamente, astraendo le complessità delle chiamate REST in un’interfaccia semplice e dichiarativa. Oggi approfondirò come Refit semplifica i client REST in ASP.NET Core, ne esplorerò i vantaggi e fornirò esempi con frammenti di codice per illustrarne l’utilizzo.

Cos’è Refit?

Refit è una libreria REST che trasforma la tua API REST in un’interfaccia. Con una semplice sintassi dichiarativa, devi solo definire un’interfaccia che descriva i tuoi endpoint. Refit genera quindi l’implementazione sottostante a runtime, permettendoti di concentrarti sulla logica di business piuttosto che sul HTTP affare.

Aggiungere Refit in un progetto

Installazione di pacchetti

Nel progetto ASP.NET Core, utilizzare la console di Gestione pacchetti o la CLI .NET e digitare quanto segue:

dotnet add package Refit

Definisci la tua interfaccia API

Crea un’interfaccia che descriva gli endpoint del servizio esterno. A scopo dimostrativo, supponiamo di voler interagire con un’ipotetica API meteo che fornisca dettagli meteorologici aggiornati.

using Refit;
using System.Threading.Tasks;

public interface IWeatherApi
{
    [Get("/weather/current")]
    public Task<WeatherResponse> GetCurrentWeatherAsync([Query] string city);
}

public class WeatherResponse
{
    public string City { get; set; }
    public float Temperature { get; set; }
    public string Description { get; set; }
}

Nel codice soprastante sono presenti alcuni elementi importanti:

  • L’attributo [Get("/weather/current")] specifica il metodo HTTP GET e il path dell’endpoint.
  • L’attributo [Query] mappa il parametro city come parametro della query.
  • La classe WeatherResponse modella la risposta JSON.

Configurazione di Refit DI

Nel file Startup.cs o Program.cs (per .NET 6 e versioni successive), registra il client Refit con il tuo contenitore DI:

using Refit;

var builder = WebApplication.CreateBuilder(args);

// Register the Refit client
builder.Services.AddRefitClient<IWeatherApi>()
                .ConfigureHttpClient(c =>
                {
                    c.BaseAddress = new Uri("https://api.example.com");
                });

var app = builder.Build();

// Minimal API example to consume the Refit client
app.MapGet("/api/weather", async (IWeatherApi weatherApi, string city) =>
{
    var weather = await weatherApi.GetCurrentWeatherAsync(city);
    return weather;
});

app.Run();

Ovviamente, questo è un codice disordinato che dovresti organizzare in classi separate, ma presta particolare attenzione alla registrazione di IWeatherApi. Nota che non appena registri il client Refit, puoi chiamare il metodo API GetCurrentWeatherAsync, facile così!

Riduzione del codice boilerplate

Il codice tradizionale per client REST spesso chiede ripetutamente la creazione manuale di richieste HTTP, l’analisi delle risposte e la gestione degli scenari di errore. Vuoi saperne di più sulla riduzione del boilerplate? Leggi Riduzione del boilerplate nelle applicazioni .NET IHost

Ecco un breve confronto:

Senza Refit

using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;

public async Task<WeatherResponse> GetCurrentWeatherAsync(string city)
{
    using var client = new HttpClient { BaseAddress = new Uri("https://api.example.com") };
    var response = await client.GetAsync($"/weather/current?city={city}");
    response.EnsureSuccessStatusCode();
    var content = await response.Content.ReadAsStringAsync();
    return JsonSerializer.Deserialize<WeatherResponse>(content);
}

Con Refit

public interface IWeatherApi
{
    [Get("/weather/current")]
    Task<WeatherResponse> GetCurrentWeatherAsync([Query] string city);
}

Con Refit, non solo il codice è più conciso, ma beneficia anche della serializzazione/deserializzazione automatica e di una migliore gestione degli errori. Questa riduzione del codice boilerplate si traduce in una maggiore leggibilità e manutenibilità dell’applicazione.

Conclusione

Refit offre un approccio moderno, efficiente e gestibile all’utilizzo delle API REST in ASP.NET Core. Riducendo il codice boilerplate grazie alla sintassi dichiarativa e alle interfacce fortemente tipizzate, Refit migliora la produttività degli sviluppatori e riduce al minimo il rischio di errori. Che si tratti di integrare servizi di terze parti o di gestire la comunicazione tra servizi in un’architettura a microservizi, Refit è uno strumento prezioso in grado di semplificare le implementazioni dei client HTTP.

ci vediamo!