Refit para C# (.NET): Cliente REST Type-Safe
1. O que é e para que serve
Refit é uma biblioteca de código aberto para a plataforma .NET que gera automaticamente implementações de clientes HTTP com base em interfaces descritas pelo desenvolvedor. Ela permite transformar uma interface C# comum em um cliente REST completo, eliminando a necessidade de escrever manualmente código repetitivo para realizar requisições HTTP, serializar/desserializar JSON e tratar erros.
O principal problema que o Refit resolve é a duplicação de código ao trabalhar com APIs REST. Em vez de criar um método separado com HttpClient para cada endpoint, configurar cabeçalhos, processar respostas e exceções, o desenvolvedor simplesmente declara uma interface com métodos anotados por atributos do Refit. A biblioteca gera a implementação automaticamente, utilizando HttpClientFactory (abordagem recomendada) ou diretamente HttpClient.
Refit é especialmente útil no desenvolvimento de arquiteturas de microsserviços, integração com APIs de terceiros (GitHub, Stripe, Telegram, etc.) e em qualquer projeto que exija interação type-safe com serviços HTTP. Ele suporta todos os métodos HTTP principais (GET, POST, PUT, DELETE, PATCH), trabalho com cabeçalhos, parâmetros de query, corpo da requisição, formulários multipart e arquivos.
2. Instalação
O Refit é distribuído via NuGet. Para instalar, use um dos seguintes comandos:
# Via .NET CLI
dotnet add package Refit
# Via Package Manager Console (Visual Studio)
Install-Package Refit
# Ou via NuGet Package Manager na IDE
Para trabalhar com métodos assíncronos e integração com ASP.NET Core, recomenda-se também instalar o pacote Refit.HttpClientFactory:
dotnet add package Refit.HttpClientFactory
Se você usa System.Text.Json (padrão no .NET Core 3.1+), nenhum pacote adicional é necessário. Para Newtonsoft.Json, instale Refit.Newtonsoft.Json.
3. Início rápido — exemplo mínimo funcional
Vamos criar um cliente simples para obter dados do JSONPlaceholder (uma API REST de teste).
Passo 1: Defina o modelo de dados:
public class Todo
{
public int Id { get; set; }
public int UserId { get; set; }
public string Title { get; set; }
public bool Completed { get; set; }
}
Passo 2: Crie a interface com atributos do Refit:
using Refit;
public interface ITodoApi
{
[Get("/todos/{id}")]
Task<Todo> GetTodoAsync(int id);
[Get("/todos")]
Task<List<Todo>> GetAllTodosAsync();
}
Passo 3: Use o Refit para criar o cliente:
using Refit;
class Program
{
static async Task Main(string[] args)
{
// Cria o cliente diretamente (sem DI)
var todoApi = RestService.For<ITodoApi>("https://jsonplaceholder.typicode.com");
// Obtém um único Todo
var todo = await todoApi.GetTodoAsync(1);
Console.WriteLine($"Todo: {todo.Title}, Completed: {todo.Completed}");
// Obtém todos os Todos
var todos = await todoApi.GetAllTodosAsync();
Console.WriteLine($"Total de todos: {todos.Count}");
}
}
Este exemplo demonstra a mecânica básica: você descreve a interface e o Refit gera a implementação que executa as requisições HTTP e desserializa as respostas.
4. Principais métodos/funções/classes
4.1. RestService.For<T>()
Assinatura: public static T For<T>
Também na biblioteca
Boost.Filesystem para C++: guia completo com exemplos práticos
Trabalhando com XML em JavaScript (Node.js): parsing, criação e validação
Trabalhando com arquivos ZIP em Java: guia completo sobre java.util.zip
Programação Reativa em C++: bibliotecas RxCpp e Boost.Signals2
Trabalho com XML em Kotlin: bibliotecas, parsing e criação de documentos