Novo Componente HttpClient Adicionado ao Symfony 4.3

Fazer solicitações HTTP (por exemplo, para APIs de terceiros) é uma necessidade freqüente de desenvolvedores que trabalham com aplicações web. No Symfony 4.3, essa tarefa ficou extremamente mais simples com um novo componente chamado HttpClient.

Uso básico

A classe Symfony\Component\HttpClient\HttpClient fornecida para fazer requisições HTTP é bastante simples:

use Symfony\Component\HttpClient\HttpClient;

$httpClient = HttpClient::create();
$response = $httpClient->request('GET', 'https://api.github.com/repos/symfony/symfony-docs');

Uma diferença significativa com outros clientes HTTP existentes é que a chamada request() não é bloqueante. Em outras palavras, o objeto $response está disponível imediatamente e a execução do código pode continuar.

Posteriormente, quando você chamar getStatusCode(), a execução do código será interrompida até que os cabeçalhos estejam disponíveis e, quando você chamar getContent(), ele irá parar até que todo o conteúdo esteja disponível (mas você pode usar as respostas de streaming):

$statusCode = $response->getStatusCode();
// $statusCode = 200
$content = $response->getContent();
// returns the raw content returned by the server (JSON in this case)
// $content = '{"id":521583, "name":"symfony-docs", ...}'
$content = $response->toArray();
// transforms the response JSON content into a PHP array
// $content = ['id' => 521583, 'name' => 'symfony-docs', ...]

Graças a esse comportamento não bloqueante, você pode fazer várias chamadas ao request() para executar requisições paralelas e acessar as informações das respostas somente depois de iniciar todas as requisições.

Por padrão, o componente usa funções nativas do PHP para fazer as requisições HTTP, assim você não precisa instalar nenhuma outra dependência. No entanto, ele usará o transporte baseado em cURL se o seu sistema tiver a biblioteca cURL e a extensão cURL do PHP instaladas.

Quando o código de status HTTP da resposta não está no intervalo 200–299 (ou seja, 3xx, 4xx ou 5xx), espera-se que seu código o manipule. Se você não fizer isso, os métodos getHeaders() e getContent() lançarão uma exceção apropriada:

// the response of this request will be a 403 HTTP error
$response = $httpClient->request('GET', 'https://httpbin.org/status/403');

// this code results in a Symfony\Component\HttpClient\Exception\ClientException
// because it doesn't check the status code of the response
$content = $response->getContent();

// do this instead
if (200 !== $response->getStatusCode()) {
// handle the HTTP request error (e.g. retry the request)
} else {
$content = $response->getContent();
}

Recursos

O novo componente HttpClient está repleto de recursos úteis. Todos eles são explicados nos documentos:

Integração do framework Symfony

Ao usar o HttpClient dentro de uma aplicação Symfony completa em vez de um componente independente, você pode configurá-lo sob a chave http_client (confira a referência completa de configuração do HttpClient):

# config/packages/framework.yaml
framework:
# ...
http_client:
max_redirects: 7
max_host_connections: 10

Em seguida, você pode injetar o HttpClient em outros serviços da seguinte forma:

use Symfony\Contracts\HttpClient\HttpClientInterface;

class SomeService
{
private $httpClient;

public function __construct(HttpClientInterface $httpClient)
{
$this->httpClient = $httpClient;
}
}

Integrações futuras

Ter um cliente HTTP padrão e oficial para as aplicações Symfony nos permitirá implementar outros recursos que exigem a comunicação com serviços de terceiros. Um exemplo recente disso é o validador NotCompromisedPassword, que torna suas aplicações mais seguras e usa o componente HttpClient para fazer as requisições HTTP necessárias para verificar se uma determinada senha foi publicamente comprometida ou não.

Além disso, o componente Mercure também está trocando seu cliente HTTP atual pelo novo componente HttpClient (veja o PR #8). Por fim, a API Platform lançará um novo conjunto de utilitários para teste de API criados com o componente HttpClient (consulte o PR #2608).

Tradução de: New in Symfony 4.3: HttpClient component