ASP.Net Core 2.1: Http Client + Refit | iMasters
Simplesmente pelo prazer de codificar, muitas vezes caímos no tipico cenário de reinventar a roda. Quantas vezes você já ouviu: "Meu amigo, isso aí já tem pronto, não precisa reinventar a roda."? Muitas, tenho certeza.
Essa frase tem suas controvérsias. Para fins didáticos acredito muito na reinvenção da roda. Não há nada melhor para aprender do que reinventar a roda. Faça seu mini-framework de desenvolvimento, invente seu próprio event bus, crie seu próprio logger, aprenda a customizar as coisas para entender como elas funcionam! Porém, utilize essa abordagem somente para fins didáticos.
Asp.Net Core 2.1: Http Client
Tenho plena certeza de que você já sabe de cor como fazer um typed client utilizando http client. Provavelmente você já fez tanto isso na sua vida e também implementar um client com uma mão só sem olhar. Principalmente quando estamos falando de um client simples. Já pensou se tivesse um cara que criasse CRUD automaticamente? Tem! Refit.
PM > Install-Package refit -version 4.6.48
Veja como é fácil configurar o Refit. Não é necessário se preocupar com implementação – basta configurar uma abstração utilizando os annotations do Refit.
public interface IExtremelyDifficultCrudApi<TAnyType, in TAnyKey> where TAnyType : class
Task<ApiResponse<List<TAnyType>>> GetAll();
Task<ApiResponse<TAnyType>> GetById(TAnyKey key);
Task<ApiResponse<TAnyType>> Create([Body] TAnyType payload);
Task<ApiResponse<TAnyType>> Update(TAnyKey key, [Body] TAnyType payload);
Task Delete(TAnyKey key);
A interface IExtremelyDifficultCrudApi<TAnyType, in TAnyKey> recebe como parâmetro o tipo do objeto e o tipo da chave primária do objeto. Note que é uma interface bem tranquila, somente com as cinco operações padrões, porém, caso queira injetar operações mais avançadas, basta torná-las genéricas e inseri-las na interface.
Já no setup final, para poder injetar o client em qualquer classe e utilizar, basta registrá-lo como um serviço no container no startup do projeto utilizando os métodos AddHttpClient e AddTypedClient.
c.SwaggerDoc("v1", new Info { Title = "Product API", Version = "v1" });
// Refit + HttpClient
services.AddHttpClient("ProductClient", client =>
client.BaseAddress = new Uri(Configuration.GetSection("CrudClient:BaseAddress").Value);
.AddTypedClient(RestService.For<IExtremelyDifficultCrudApi<Product, string>>);
Para testar o Refit você pode consumir qualquer API de sua preferência. Neste caso estou utilizando como server para este client o projeto de API que criamos nos dois artigos anteriores. Você pode conferir o código aqui, e para maiores detalhes da implementação, os artigos são estes a seguir:
https://medium.com/@kenerrydeveloper/padr%C3%B5es-de-web-api-parte-1-documenta%C3%A7%C3%A3o-requests-responses-503491d3c55c
https://medium.com/@kenerrydeveloper/padr%C3%B5es-de-web-api-parte-2-middleware-26cc0e16ea12
Veja abaixo a implementação da ProductController que possui todos os seus endpoints apontados para os endpoints criados nos dois artigos acima (CRUD de Product). Para utilizar o Refit na controller, basta injetá-lo no construtor.
private readonly IExtremelyDifficultCrudApi<Product, string> _clientFactory;
public ProductController(IExtremelyDifficultCrudApi<Product, string> clientFactory)
var allProductsRequest = await _clientFactory.GetAll();
if (allProductsRequest.Content != null)
return Ok(allProductsRequest.Content);
//Avoiding invalid id to call to api
var product = await _clientFactory.GetById(id);
if (product != null && product.IsSuccessStatusCode)
return Ok(product.Content);
public async Task<IActionResult> Register([FromBody] Product product)
var createdProduct = await _clientFactory.Create(product);
return Created(nameof(GetById), createdProduct.Content);
public async Task<IActionResult> Update([FromRoute] string id, [FromBody] Product product)
var productFromApi = await _clientFactory.Update(id, product);
if (productFromApi != null && productFromApi.IsSuccessStatusCode)
return Accepted(productFromApi.Content);
public async Task<IActionResult> Delete([FromRoute] string id)
await _clientFactory.Delete(id);
Exige pouco código de implementação, é muito simples e muito útil. Espero que tenha gostado desta dica!
Por hoje é só. Muito obrigado pela leitura e qualquer dúvida fique a vontade para me procurar e enviar e-mails! Espero que de alguma forma eu tenha ajudado!