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:
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.
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)
2 – Informe um nome e local para sua solução
3 – Informe a versão de .NET, no meu caso estou usando .NET 6 com as demais opções marcadas conforme a imagem
4 – Sua solução criada deve ter a seguinte estrutura
5 – Eu prefiro já excluir a WeatherForecast de exemplo.
6 – Vamos criar agora uma pasta chamada Application
7 – Dentro dela vamos criar dois arquivos, uma interface chamada IGitHubService e sua classe concreta GitHubService.
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.
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:
9 – Agora no seu arquivo appsettings.Development.json e coloque a URL base do GitHub, conforme imagem:
10 – Crie uma pasta chamada Configuration e dentro uma classe que vai estender a configuração por meio de método de extensão.
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:
11 – Vamos implementar nosso serviço agora, para conseguir obter os dados do meu repositório do GitHub.
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:
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.
MAIS INFORMAÇÕES: