A classe HttpClient é largamente utilizada praticamente em todos os projetos que já trabalhei e tem uma função muito importante: estabelecer comunicação, enviando requisições e obtendo as suas respostas. Possui algumas vantagens, pode ser facilmente implementada e configurada, mas já pensou que você pode estar usando em alguns casos de forma inadequada?

A classe HttpClient é Disposable, mas usar com a instrução using acaba em algum momento trazendo prejuízos a sua aplicação, mesmo que ela é descartada, de fato o soquete não é liberado imediatamente, levanto a aplicação a um esgotamento conhecido por socket exhaustion”. Ou seja, sempre que é instanciada e por meio de vários processos que uma aplicação pode ter de continuar a instanciá-la com certeza levará a aplicação a sua exaustão, pois esgotará o número de soquetes disponíveis.

 

Para resolver estes problemas e melhorar o gerenciamento de instâncias e configurações, a partir da versão 2.1 do .NET foi introduzida a interface IHttpClientFactory que segundo a documentação da Microsoft oferece os seguintes benefícios:

 

  • Fornece um local central para nomear e configurar objetos lógicos. Por exemplo, você pode configurar um cliente (Agente de Serviço) que está pré-configurado para acessar um microsserviço específico de HttpClient;
  • Codificar o conceito de middleware de saída através de delegar manipuladores e implementar middleware baseado em Polly para tirar proveito das políticas de resiliência da Polly.HttpClient;
  • HttpClient já tem o conceito de delegar manipuladores que poderiam ser ligados em conjunto para solicitações HTTP de saída. Você pode registar clientes HTTP na fábrica e pode usar um manipulador Polly para usar as políticas polly para rejulgue, CircuitBreakers e assim por diante;
  • Gerencie a vida útil do HttpMessageHandler para evitar os problemas/problemas mencionados que podem ocorrer ao gerenciar vidas você mesmo de HttpClient.

A implementação é feita por meio de injeção de dependência e suas instâncias podem ser descartadas com segurança.

 

Em projetos web podemos registar via classe Program.cs, segue exemplo:

 

Picture1-4

Supondo que você trabalhe com microsserviços ou uma aplicação distribuída, já deve ter tido a necessidade de configurar corretamente a URL base para cada serviço e de forma escalável fazer com que todo esse código pudesse ser reaproveitável e elegante do ponto de vista de implementações, aqui um exemplo onde podemos além de registar o HttpClient, configurar sua URL base, incluir políticas e ainda é possível incluir midlewares, manipuladores de eventos, configurar o Polly por exemplo e aumentar ainda mais a segurança e resiliência da sua aplicação.

 

Picture2-2

Na imagem acima temos um serviço CatalogService responsável por implementar funcionalidades e entre elas fazer chamadas para uma API externa. 

 

Mas vamos praticar!

Vamos criar uma API que vai comunicar-se com uma API externa do GitHub.

 

1 – Crie um projeto no VS 2022 – ASP.NET Core Web Api (.NET 6)

Picture3-2

 

2 – Informe um nome e local para sua solução

 

Picture4-2

 

3 – Informe a versão de .NET, no meu caso estou usando .NET 6 com as demais opções marcadas conforme a imagem

 

Picture5-2

 

4 – Sua solução criada deve ter a seguinte estrutura

 

Picture6-2

 

5 – Eu prefiro já excluir a WeatherForecast de exemplo.

 

6 – Vamos criar agora uma pasta chamada Application

 

Picture7-2

 

7 – Dentro dela vamos criar dois arquivos, uma interface chamada IGitHubService e sua classe concreta GitHubService.

 

Picture8-2

 

O objetivo é implementar serviço onde seja possível listar meus repositórios do GitHub, utilizando para isso claro, HttpClientFactory.

 

Obs.: A classe Root é usada para deserializar a resposta com a lista dos repositórios com uma série de informações, vou disponibilizar o código no GitHub para que você possa copiar a classe e implementar.

 

Picture9-1

 

8 – Precisamos antes de tudo registar nosso serviço, para que ao iniciar a aplicação a instância fique disponível, portanto vá até sua classe Program.cs e coloque o seguinte código:

 

Picture10-1

9 – Agora no seu arquivo appsettings.Development.json e coloque a URL base do GitHub, conforme imagem:

 

Picture11-1

 

10 – Crie uma pasta chamada Configuration e dentro uma classe que vai estender a configuração por meio de método de extensão.

 

Picture12-1

Aqui informações muito importantes, na linha 7 precisamos registar o serviço pelo método AddHttpClient, dar um nome, que no meu caso é “GitHub” e dentro configurar as opções, que neste caso busca do arquivo. json a url. Também incluí como um Header default o UserAgent necessário para obter os repositórios do GitHub.

 

Feito isso, precisamos novamente no nosso arquivo Program.cs informar que queremos usar esta configuração, segue:

 

Picture13-1

11 – Vamos implementar nosso serviço agora, para conseguir obter os dados do meu repositório do GitHub.

 

Picture14

12 – Finalmente, vamos agora injetar nosso serviço na Controller que vamos criar, crie uma controller chamada GitHubController e faça a injeção de dependência do serviço, segue imagem:

 

Picture15

Injetamos nosso serviço na controller e basicamente precisamos apenas fazer uma chamada para obter os dados de todos meus repositórios.

 

O IHttpClientFactory é uma ótima opção para você centralizar suas chamadas rest, melhorar significativamente o gerenciamento do ciclo de vida das instâncias HttpClient e pode ser usado ainda com a implementações importantes de resiliência como Polly e simplificações de chamadas rest como Refit.

 

Picture17

 

MAIS INFORMAÇÕES:

Partilha este artigo