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:
- Soporta para autenticación, tanto básica como basada en "bearer tokens".
- Puedes pasar parámetros en la query string y también puedes pasar cabeceras HTTP personalizadas.
- Posibilidad de enviar datos mediante cadenas de texto, closures y recursos de PHP.
- Streaming de respuestas para obtener una respuesta compleja a trozos en vez de tener que esperar a recibirla entera.
- Cacheado de peticiones y respuestas.
- Auto-configuración del cliente HTTP en función de la URL de la petición.
- Compatibilidad con PSR-7 y PSR-18.
- Test sencillos gracias a un cliente HTTP especial para tests.
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
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.