Nuevo en Symfony 4.3: Componente HttpClient

Una de las necesidades más habituales de las aplicaciones web es el envío de peticiones HTTP (por ejemplo a APIs de terceros). En Symfony 4.3 será más fácil hacer esas peticiones gracias a un nuevo componente llamado HttpClient con el que puedes reemplazar a otras librerías similares (por ejemplo, Guzzle).

Uso básico

La clase Symfony\Component\HttpClient\HttpClient es la base para enviar las peticiones HTTP:

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

Una de las diferencias más importantes respecto a otros clientes HTTP es que el método request() es no bloqueante. En otras palabras, el objeto $response está disponible inmediatamente después de hacer la petición y el programa puede continuar su ejecución.

Cuando llames al método getStatusCode(), la ejecución de la aplicación se para hasta que las cabeceras HTTP estén disponibles. Y si llamas al método getContent(), se para hasta recibir todos los contenidos de la respuesta (aunque también puedes usar streaming en las respuestas):

$statusCode = $response->getStatusCode();
// $statusCode = 200
 
$content = $response->getContent();
// devuelve el contenido de la respuesta tal y como se ha recibido (JSON en este caso)
// $content = '{"id":521583, "name":"symfony-docs", ...}'
 
$content = $response->toArray();
// transforma la respuesta JSON a un array PHP
// $content = ['id' => 521583, 'name' => 'symfony-docs', ...]

Gracias a este comportamiento no bloqueante, puedes llamar varias veces a request() para hacer peticiones en paralelo y acceder a las respuestas solo cuando se hayan realizado todas las peticiones.

Por defecto este componente utiliza las funciones nativas de PHP para realizar las peticiones, así que no tienes que instalar ninguna dependencia. No obstante, si en tu máquina has instalado/activado la librería cURL y la extensión cURL de PHP, entonces usará cURL automáticamente.

Si el código de estado HTTP de la respuesta no está en el rango 200-299 (es decir, que es 3xx, 4xx o 5xx) tu aplicación tiene que tratar con el error. Si no lo haces, cuando llames a los métodos getHeaders() y getContent() verás una excepción:

// la código de estado de la respuesta de esta petición es 403
$response = $httpClient->request('GET', 'https://httpbin.org/status/403');
 
// si no compruebas el código de estado de la respuesta, verás una excepción de tipo
// Symfony\Component\HttpClient\Exception\ClientException (como en el siguiente ejemplo)
$content = $response->getContent();
 
// lo que tienes que hacer es comprobar explícitamente el código de estado
// (en este caso, no se lanza ninguna excepción)
if (200 !== $response->getStatusCode()) {
    // handle the HTTP request error (e.g. retry the request)
} else {
    $content = $response->getContent();
}

Funcionalidades

A pesar de que acaba de ser creado, el nuevo componente HttpClient está lleno de funcionalidades que te serán muy útiles en tus aplicaciones. Todas ellas se explican con detalle en la documentación:

Integración con el framework Symfony

Si utilizas este componente dentro de una aplicación Symfony en vez de como un componente suelto, puedes configurarlo mediante la opción http_client (echa un vistazo también a todas las opciones de configuración de HttpClient:

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

Ahora ya puedes inyectar el cliente HTTP en cualquier otro servicio:

use Symfony\Contracts\HttpClient\HttpClientInterface;
 
class SomeService
{
    private $httpClient;
 
    public function __construct(HttpClientInterface $httpClient)
    {
        $this->httpClient = $httpClient;
    }
}

Próximas integraciones

Disponer de un cliente HTTP oficial en Symfony nos permitirá implementar muchas otras funcionalidades que requieren comunicarse con servicios de terceros. Uno de estos ejemplos es el reciente validador de la seguridad de las contraseñas que realiza peticiones HTTP a un servicio web mediante el componente HttpClient.

Además, el componente Mercure también va a pasarse a este nuevo componente y API Platform va a añadir una serie de utilidades para testear APIs basadas en este componente.

Esta funcionalidad fue contribuida por Nicolas Grekas en el pull request #30413.

Fuente: New in Symfony 4.3: HttpClient component

Comentarios

Publicada el

21 de junio de 2019

Etiquetas

Proyectos Symfony destacados

La plataforma de eCommerce 100% Symfony que rivaliza con Magento y PrestaShop. Ver más

Síguenos en @symfony_es para acceder a las últimas noticias.