Refit é uma biblioteca de código aberto para .NET, .NET Core e Xamarin que torna o consumo de APIs REST mais simples e fácil, permitindo que você defina os pontos de extremidade da API como interfaces C#, eliminando assim a necessidade de criar solicitações HTTP e analisar respostas HTTP manualmente.

Neste artigo, vamos nos aprofundar na biblioteca Refit para .NET e ver em primeira mão como ela simplifica o desenvolvimento de APIs. Para usar os exemplos de código fornecidos neste artigo, você deve ter o Visual Studio 2022 instalado em seu sistema. Se você ainda não tem uma cópia, pode baixar o Visual Studio 2022 aqui.

Nas seções abaixo, implementaremos dois aplicativos, uma Contact API e um aplicativo cliente para consumir a Contact API. O aplicativo Contact API compreenderá os seguintes tipos:

  • Contato: Representa a classe do modelo.
  • IContactRepository: representa a interface para o repositório de contatos.
  • ContactRepository: representa a classe de repositório de contatos que contém métodos para retornar dados de contato.
  • ContactsController: representa o controlador de API usado para expor endpoints da API de contato aos clientes da API.

O aplicativo cliente usará o Refit para consumir a API de contato e exibir os registros recuperados na janela do console.

O que é Refit? Por que é útil?

Refit é uma biblioteca REST rápida e segura para .NET, .NET Core e Xamarin que transforma sua API REST em uma interface, facilitando o consumo de serviços web RESTful. O Refit transforma automaticamente chamadas HTTP em interfaces C# usando atributos para descrever operações REST, simplificando assim o processo de conexão com APIs usando o mínimo de código.

Para consumir APIs usando o Refit, você precisa de uma interface que possa interagir com sua API. O Refit atua como um wrapper em torno dos métodos dessa interface e manipula solicitações e respostas HTTP de forma elegante. O Refit gerará automaticamente o código boilerplate necessário para você acessar suas APIs.

Se estiver usando o Refit pela primeira vez, você deverá primeiro configurar a instância do cliente HTTP especificando o endereço base, cabeçalhos HTTP, informações de serialização e desserialização, etc. O trecho de código a seguir mostra como podemos configurar a instância do cliente HTTP para se conectar a um ponto de extremidade no ASP.NET Core.

string baseAddress = "http://localhost:59904/";
HttpClient _client = new HttpClient();
_client.BaseAddress = new Uri($"{BaseUrl}");
_client.DefaultRequestHeaders.Accept.Clear();
_client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
string url = BaseUrl + "api/authors";
var response = await _client.GetAuthors(url);
if (response.IsSuccessStatusCode)
{ 
    var result = await response.Content.ReadAsStringAsync();
    var data = JsonSerializer.Deserialize>(result);
}

Se você já estiver usando o Refit, não precisa se preocupar com o código clichê, porque o Refit pode lidar com todas essas tarefas com apenas algumas linhas de código C#.

string baseAddress = "http://localhost:59904/";
var endpoint = RestService.For(baseAddress);
var contacts = await endpoint.GetAuthors();

Como você pode ver nos trechos de código anteriores, o Refit pode nos economizar muito tempo e esforço, eliminando a necessidade de escrever o código clichê.

Nas próximas seções, implementaremos uma API web simples no ASP.NET Core. Após criarmos nossa API, implementaremos um cliente Refit para consumi-la.

Crie um projeto ASP.NET Core Web API no Visual Studio 2022

Para criar um projeto ASP.NET Core 8 Web API no Visual Studio 2022, siga as etapas descritas abaixo.

  1. Inicie o IDE do Visual Studio 2022.
  2. Clique em “Criar novo projeto”.
  3. Na janela “Criar novo projeto”, selecione “ASP.NET Core Web API” na lista de modelos exibidos.
  4. Clique em Avançar.
  5. Na janela “Configure your new project”, especifique o nome e o local para o novo projeto. Opcionalmente, marque a caixa de seleção “Place solution and project in the same directory”, dependendo de suas preferências.
  6. Clique em Avançar.
  7. Na janela “Informações Adicionais” mostrada a seguir, selecione “.NET 8.0 (Suporte de Longo Prazo)” como a versão do framework e certifique-se de que a caixa “Usar controladores” esteja marcada. Usaremos controladores neste projeto.
  8. Em outro lugar na janela “Informações Adicionais”, deixe o “Tipo de Autenticação” definido como “Nenhum” (o padrão) e garanta que as caixas de seleção “Habilitar Suporte a API Aberta”, “Configurar para HTTPS” e “Habilitar Docker” permaneçam desmarcadas. Não usaremos nenhum desses recursos aqui.
  9. Clique em Criar.

Usaremos este projeto ASP.NET Core Web API para criar nossa API nas seções abaixo.

Crie a classe do modelo Contact

Crie uma nova classe chamada Contato no projeto da API Web que você acabou de criar e insira o código fornecido abaixo.

namespace Refit_Demo
{
    public class Contact
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Address { get; set; }
        public string Phone { get; set; }
    }
}

Usaremos a classe Contact na próxima seção para trabalhar com dados.

Crie a classe ContactRepository

Em seguida, criaremos uma classe de repositório para trabalhar com os dados de Contato. Para simplificar e resumir, armazenaremos nossos dados em uma lista na memória. Você pode se sentir à vontade para alterar essa implementação para armazenar os dados em um banco de dados conforme suas necessidades. A classe ContactRepository implementa o IContactRepository. Essa interface contém a declaração de dois métodos, a saber, os métodos GetContact e GetContacts. Enquanto o primeiro retorna um registro de contato com base no id passado a ele como um parâmetro, o último retorna todos os contatos.

A listagem de código a seguir ilustra a interface IContactRepository e a classe ContactRepository.

public interface IContactRepository
{
    public Contact GetContact(int id);
    public List GetContacts();
}
public class ContactRepository: IContactRepository
{
    private readonly List contacts = new List();
    public ContactRepository()
    {
        contacts = new List()
        {
            new Contact()
            { Id =1, FirstName = "Keaton", LastName = "Underwood",
                Address = "12/3 ABC Road, Chicago, USA",
            Phone = "1234567890"},
            new Contact(){ Id = 2, FirstName = "John", LastName = "Smith",
                Address = "12/3 ABC Road, New York, USA",
            Phone = "0987654321"}
        };
    }
    public Contact GetContact(int id)
    {
        return contacts.SingleOrDefault(c => c.Id == id);
    }
    public List GetContacts()
    {
        return contacts;
    }
}

Você pode registrar uma instância do tipo IContactRepository com a coleção de serviços no Program.cs usando o seguinte trecho de código.

builder.Services.AddScoped();

Isso permitirá que você use injeção de dependência para criar uma instância do tipo IContactRepository no aplicativo.

Crie o controlador de API

Vamos agora criar a classe controladora para nossa API Contacts. Para fazer isso, crie um novo controlador de API chamado ContactsController e substitua o código gerado pelo código a seguir.

using Microsoft.AspNetCore.Mvc;
namespace Refit_Demo.Controllers
{
    (Route("api/(controller)"))
    (ApiController)
    public class ContactsController : ControllerBase
    {
        private readonly IContactRepository _contactRepository;
        public ContactsController(IContactRepository contactRepository)
        {
            _contactRepository = contactRepository;
        }
        (HttpGet)
        public async Task> Get()
        {
            return await _contactRepository.GetContacts();
        }
        (HttpGet("{id}"))
        public async Task Get(int id)
        {
            return await _contactRepository.GetContact(id);
        }
    }
}

Observe como usamos injeção de construtor para criar uma instância do tipo IContactRepository na listagem de código anterior.

Nas próximas seções, criaremos um projeto de aplicativo de console e construiremos o cliente Refit que consumirá nossa API de contatos.

Crie um projeto de aplicativo de console .NET Core no Visual Studio

Siga as etapas descritas abaixo para criar um novo projeto de aplicativo de console .NET Core no Visual Studio.

  1. Inicie o IDE do Visual Studio.
  2. Clique em “Criar novo projeto”.
  3. Na janela “Criar novo projeto”, selecione “Console App (.NET Core)” na lista de modelos exibidos.
  4. Clique em Avançar.
  5. Na janela “Configure seu novo projeto”, especifique o nome e o local para o novo projeto.
  6. Clique em Avançar.
  7. Na janela “Informações adicionais” mostrada a seguir, escolha “.NET 8.0 (Suporte de longo prazo)” como a versão do framework que você deseja usar.
  8. Clique em Criar.

Usaremos este projeto de aplicativo de console .NET Core para criar nosso cliente Refit API.

Instalar o pacote Refit NuGet

Para instalar o Refit em seu projeto, selecione o projeto na janela Solution Explorer, clique com o botão direito e selecione “Gerenciar pacotes NuGet”.

Na janela do NuGet Package Manager, procure pelo pacote Refit e instale-o. Como alternativa, você pode instalar o(s) pacote(s) por meio do console do NuGet Package Manager inserindo os comandos mostrados abaixo.

PM> Instalação-Reequipamento de Pacote

Crie o cliente da API Refit

Agora substitua o código gerado no arquivo Program.cs pela seguinte listagem de código.

using Refit;
string baseAddress = "http://localhost:59904/";
var contactsAPI = RestService.For(baseAddress);
var contacts = await contactsAPI.GetContacts();
foreach (var contact in contacts)
{
    Console.WriteLine($"{contact.Id} | {contact.FirstName} |
    {contact.LastName}");
}
Console.ReadLine();
(Headers("Accept: application/json", "Content-type: application/json"))
public interface IContactService
{
    (Get("/api/contacts"))
    public Task GetContact(int id);
    (Get("/api/contacts"))
    public Task> GetContacts();
}
public class Contact
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address { get; set; }
    public string Phone { get; set; }
}

Executar a aplicação

Como há dois aplicativos neste exemplo, você deve executar ambos um por um. Primeiro, execute o aplicativo da API seguido pelo aplicativo do console do cliente da API. Quando ambos os aplicativos forem iniciados, você observará os dados recuperados do aplicativo da API de contatos exibidos no console, conforme mostrado na Figura 1.

Figura 1. Seu cliente da API Refit em ação.

Refit é uma ótima escolha para implementar clientes HTTP REST API. O Refit simplifica muito o código boilerplate necessário para conectar e trabalhar com REST APIs em seus aplicativos ASP.NET Core. Um ponto importante a ser observado é que, quando você estiver usando o Refit, todas as solicitações devem ser assíncronas. O Refit não oferece suporte a chamadas de rede síncronas.