Simplificando Clientes Rest com Refit em ASP.NET Core

Aprenda como usar o Refit reduzindo código para chamar serviços REST, melhorando sua aplicação e aumentando velocidade de desenvolvimento.

No desenvolvimento de aplicações modernas, fazer chamadas HTTP para APIs externas é uma tarefa comum, mas tediosa. Frequentemente, os desenvolvedores se deparam com código repetitivo ao configurar clientes HTTP, analisar respostas e lidar com erros. O Refit, uma biblioteca REST para .NET, traz uma abordagem mais leve, abstraindo as complexidades das chamadas REST em uma interface simples e declarativa. Hoje, vou me mostrar como o Refit simplifica clientes REST para ASP.NET Core, explorar seus benefícios e fornecer exemplos e trechos de código para ilustrar seu uso.

O que é Refit?

Refit é uma biblioteca REST leve que transforma sua API REST em uma interface ativa. Com uma sintaxe declarativa simples, você só precisa definir uma interface que descreva seus endpoints. O Refit então gera a implementação em tempo de execução, permitindo que você se concentre na lógica de negócios em vez da chamadas HTTP.

Configurando o Refit no Projeto

Instalando Pacotes

No diretório do seu projeto, use o Package Manager no console ou o .NET CLI e digite:

dotnet add package Refit

Definindo sua Interface de API

Crie uma interface que descreva os endpoints do serviço externo. Para demonstração, vamos supor que queremos interagir com uma API meteorológica que fornece detalhes meteorológicos atuais.

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; }
}

No código acima, temos alguns elementos importantes:

  • O atributo [Get("/weather/current")] especifica o verbo GET do método e o caminho do endpoint.
  • O atributo [Query] mapeia o parâmetro do método com o parâmetro da query string.
  • A classe WeatherResponse modela a resposta esperada em JSON.

Configure a Injeção de Dependência (DI) do Refit

No seu Startup.cs ou Program.cs (para .NET 6 e superior), registre o cliente Refit com seu contêiner 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();

O meu exemplo é um código simples e bagunçado, que você deve organizar em classes separadas, mas preste atenção ao registro da interface IWeatherApi. Observe que assim que você registrar o cliente Refit, pode chamar o método de API GetCurrentWeatherAsync, simples assim!

Reduzindo Código Repetitivo

O código de um cliente REST tradicional frequentemente envolve a criação manual de solicitações HTTP, a análise de respostas e o tratamento de erro. Quer saber mais sobre como reduzir código repetitivo? Leia Reduzindo o Boilerplate em Aplicativos .NET IHost

Aqui vai uma breve comparação:

Sem 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);
}

Com Refit

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

Com o Refit, o código não só fica mais simples, como também traz serialização/desserialização automática e um melhor tratamento de erros. Essa redução no boilerplate resulta em melhor legibilidade e facilita a manutenção em toda a aplicação.

Conclusão

O Refit oferece uma abordagem moderna, eficiente e sustentável para o consumo de APIs REST no ASP.NET Core. Ao reduzir o boilerplate por meio de sua sintaxe declarativa e interfaces fortemente tipadas, o Refit melhora a produtividade do desenvolvedor e minimiza o potencial de erros. Seja integrando serviços de terceiros ou gerenciando a comunicação entre serviços em uma arquitetura de micros serviços, o Refit é uma ferramenta valiosa que pode otimizar suas implementações de clientes HTTP.

Até mais!