Índice de contenido
- ¿Qué es el cliente HTTP de Laravel y por qué usarlo?
- Tipos de Peticiones
- Diferencias entre Guzzle y el cliente HTTP de Laravel
- Cuándo merece la pena usarlo en proyectos reales
- Cómo hacer peticiones HTTP en Laravel (GET, POST, PUT, DELETE)
- Peticiones GET con parámetros
- Enviar datos con POST, PUT y PATCH
- Consumir APIs que devuelven JSON, texto o HTML
- Manejo de respuestas HTTP en Laravel
- Comprobar respuestas exitosas y fallidas
- Enviar headers, tokens y autenticación en APIs externas
- Headers personalizados
- Autenticación básica
- Autenticación con Bearer Token
- Manejo de errores y excepciones con el cliente HTTP de Laravel
- Lanzar excepciones automáticamente
- Registrar errores en producción
- Timeouts, reintentos y peticiones concurrentes
- Peticiones concurrentes con Http::pool
- Macros HTTP y reutilización de clientes
- Probar APIs externas con el cliente HTTP de Laravel
- Evitar llamadas reales en tests
- Buenas prácticas al consumir APIs con Laravel
- Preguntas frecuentes sobre el cliente HTTP de Laravel
- Conclusión: cuándo y cómo usar el cliente HTTP de Laravel
El cliente HTTP de Laravel es una característica incorporada en el framework que permite hacer solicitudes HTTP desde tu aplicación Laravel. Con esto, podemos conectarnos a cualquier sistema o API basado en HTTP, o a cualquier servicio que pueda recibir peticiones HTTP. Pasé de consumir APIs con Guzzle “a pelo” a usar el cliente HTTP nativo, y el cambio en legibilidad, orden y mantenibilidad del código fue enorme.
Laravel nos permite interactuar con APIs externas o internas de una forma limpia, expresiva y muy bien integrada con el framework. Ya sea para consumir un JSON, enviar datos a un servicio externo o manejar errores en producción, el cliente HTTP está pensado para el día a día real de un proyecto.
¿Qué es el cliente HTTP de Laravel y por qué usarlo?
El cliente HTTP de Laravel es una capa de abstracción construida sobre Guzzle, incluida por defecto en el framework desde Laravel 7. Técnicamente sigue usando Guzzle por debajo, pero con una sintaxis mucho más clara y orientada a productividad.
Tipos de Peticiones
Estas peticiones pueden ser de los tipos básicos soportados por HTTP, como GET, POST, PUT o DELETE. El cliente HTTP de Laravel proporciona un canal fácil de utilizar e intuitivo para realizar este tipo de solicitudes.
Diferencias entre Guzzle y el cliente HTTP de Laravel
Cuando usas Guzzle directamente, tienes potencia total, pero también una sintaxis más verbosa y cercana a PHP “crudo”. En proyectos Laravel, eso suele traducirse en código menos legible y más difícil de mantener.
En cambio, el cliente HTTP de Laravel:
- Reduce drásticamente el boilerplate
- Encadena métodos de forma expresiva
- Se integra con testing, logging y excepciones
- Facilita retries, timeouts y autenticación
Guzzle directo solo compensa en casos muy específicos. Para el 90% de integraciones API, el cliente HTTP de Laravel es la mejor opción.
Cuándo merece la pena usarlo en proyectos reales
- Consumir APIs REST externas
- Integrar microservicios
- Conectar con pasarelas de pago, CRMs o ERPs
- Hacer pruebas de endpoints sin llamadas reales
- Centralizar integraciones externas de forma limpia
Cómo hacer peticiones HTTP en Laravel (GET, POST, PUT, DELETE)
Vamos a conocer cómo podemos enviar peticiones HTTP en Laravel. Estas peticiones que podemos enviar corresponden a operaciones de tipo CRUD, utilizando los métodos GET, POST, PUT, PATCH y DELETE. Con ellas, es posible comunicarnos con cualquier otro sistema que permita recibir este tipo de solicitudes para así interconectar aplicaciones.
No importa si se trata de un sistema propio o externo: siempre podemos enviar peticiones y trabajar con la data que recibamos, ya sea un JSON, texto, una página HTML, una imagen, videos… etcétera.
Laravel soporta todos los métodos HTTP habituales para operaciones CRUD.
Con el paquete de guzzlehttp/guzzle que viene instalado con Laravel desde hace mucho tiempo, puedes ver un ejemplo del código de como podemos realizar este tipo de peticiones con este paquete:
$client = new GuzzleHttp\Client();
$res = $client->request('GET', 'https://api.github.com/user', [
'auth' => ['user', 'pass']
]);
echo $res->getStatusCode();
// "200"
echo $res->getHeader('content-type')[0];
// 'application/json; charset=utf8'
echo $res->getBody();
// {"type":"User"...'
// Send an asynchronous request.
$request = new \GuzzleHttp\Psr7\Request('GET', 'http://httpbin.org');
$promise = $client->sendAsync($request)->then(function ($response) {
echo 'I completed! ' . $response->getBody();
});
$promise->wait();Podemos hacer prácticamente cualquier cosa; el problema —si es que realmente existe un problema— es que la sintaxis no es del todo limpia. Nos recuerda mucho a PHP puro y duro, y a quienes usamos Laravel nos gusta tener las cosas más organizadas, con mejor legibilidad, escalabilidad y, joder, que se pueda leer sin tanto rollo.
Para eso, Laravel incorpora ahora un paquete nativo integrado por defecto en el framework, ya que el anterior era simplemente un paquete instalado automáticamente. Puedes ver dicho paquete directamente en tu archivo composer.json:
En fin, para emplear el nuevo paquete es mucho más bonito *-*
$response = Http::get('https://google.com');
$response->body() : string;
$response->json() : array|mixed;Peticiones GET con parámetros
El clásico, comencemos realizando una petición de tipo GET:
use Illuminate\Support\Facades\Http;
$response = Http::get('https://api.example.com/users', [
'page' => 1,
'limit' => 10,
]);
$data = $response->json();Aquí puedes consumir una API externa y trabajar directamente con el array resultante. En proyectos reales, esto simplifica mucho la lógica de controladores y servicios.
Enviar datos con POST, PUT y PATCH
da igual si hacer una petición de tipo get o post..., solamente tienes que cambiar el método por el que quieras emplear
$response = Http::post('https://jsonplaceholder.typicode.com/posts', [
'title' => 'foo',
'body' => 'bar',
'userId' => 1,
]);
$result = $response->json();Cambiar de GET a POST o PUT es tan simple como cambiar el método. Esa coherencia es una de las grandes ventajas del cliente HTTP.
Consumir APIs que devuelven JSON, texto o HTML
No todas las APIs devuelven JSON. A veces recibirás HTML, texto plano o incluso binarios.
$response = Http::get('https://google.com');
$html = $response->body();
***
Http::post('https://jsonplaceholder.typicode.com/posts',[
'title' => 'foo 2',
'body' => 'bar',
'userId' => 1,
])->json()En algún proyecto incluso llegué a procesar HTML remoto para transformarlo internamente, y el cliente HTTP lo soporta sin problemas.
Manejo de respuestas HTTP en Laravel
Uno de los puntos fuertes es cómo Laravel maneja las respuestas.
Obtener body, json y status code
$status = $response->status();
$body = $response->body();
$json = $response->json();Se puede capturar la respuesta y manejarla como desees dentro de la aplicación. Puedes usar plugins como el de CKEditor para poder ver el contenido HTML que obtengas al hacer la conexión.
Comprobar respuestas exitosas y fallidas
if ($response->successful()) {
// Código 2xx
}
if ($response->failed()) {
// Código distinto de 2xx
}Enviar headers, tokens y autenticación en APIs externas
Este punto aparece constantemente en problemas reales, como se ve en Reddit.
Headers personalizados
$response = Http::withHeaders([
'Accept' => 'application/json',
'X-API-KEY' => 'tu-api-key',
])->get('https://api.example.com/data');Autenticación básica
$response = Http::withBasicAuth('usuario', 'password')
->get('https://api.example.com/users');Autenticación con Bearer Token
$response = Http::withToken('tu-token')
->get('https://api.example.com/users');En más de una integración real, esta fue exactamente la solución después de probar con Postman y no saber cómo trasladarlo a Laravel.
Manejo de errores y excepciones con el cliente HTTP de Laravel
En producción, los errores pasan, y hay que manejarlos bien.
Uso de try/catch y ConnectionException
use Illuminate\Http\Client\ConnectionException;
try {
$response = Http::get('https://api.example.com/users');
} catch (ConnectionException $e) {
report($e);
}Siempre es buena idea manejar las posibles excepciones que pueden ocurrir al momento de realizar las conexiones.
La más sencilla es mediante el try catch en la cual puedes colocar justamente la excepción que está ocurriendo o la genérica; estas excepciones pueden ocurrir al momento de que coloques una ruta que no existe o que el servidor está caído...
Lanzar excepciones automáticamente
$response = Http::get('https://api.example.com/users')->throw();Esto lanza una excepción si ocurre un error 4xx o 5xx, algo que personalmente uso mucho cuando quiero fallar rápido.
Registrar errores en producción
Usar report($e) permite dejar trazas claras en los logs, algo crítico cuando una API externa empieza a fallar sin previo aviso.
Puedes registrar la posible excepción en un log de Laravel con report($e), y esto es bastante útil en producción, para eso empleamos la función de y le pasamos la excepción.
Timeouts, reintentos y peticiones concurrentes
Configurar timeout y retry
$response = Http::timeout(3)
->retry(3, 100)
->get('https://api.example.com/users');Perfecto para APIs inestables.
Peticiones concurrentes con Http::pool
$responses = Http::pool(fn ($pool) => [
$pool->get('https://api.example.com/users'),
$pool->get('https://api.example.com/posts'),
]);Ideal cuando necesitas múltiples recursos sin penalizar rendimiento.
Macros HTTP y reutilización de clientes
Las macros permiten centralizar configuraciones de APIs externas.
Http::macro('github', function () {
return Http::withToken(config('services.github.token'))
->baseUrl('https://api.github.com');
});
$response = Http::github()->get('/users/laravel');En proyectos grandes, esto reduce duplicación y errores humanos.
Probar APIs externas con el cliente HTTP de Laravel
Laravel brilla especialmente en testing.
Simular respuestas con Http::fake
Http::fake([
'github.com/*' => Http::response(['name' => 'Taylor'], 200),
]);
$response = Http::get('https://github.com/users/taylor');Evitar llamadas reales en tests
Http::preventStrayRequests();Esto garantiza que ninguna prueba haga peticiones reales por error.
Buenas prácticas al consumir APIs con Laravel
- Centraliza integraciones en servicios
- Nunca hardcodees tokens o URLs
- Usa timeouts y retries siempre
- Registra errores en producción
- Testea sin tocar la red
Estas prácticas marcan la diferencia entre una integración “que funciona” y una robusta y mantenible.
Preguntas frecuentes sobre el cliente HTTP de Laravel
- ¿Laravel usa Guzzle internamente?
- Sí, el cliente HTTP es una abstracción sobre Guzzle.
- ¿Es mejor que usar cURL directamente?
- En Laravel, sin duda. Es más limpio, testable y mantenible.
- ¿Se puede usar en producción sin problemas?
- Sí, está diseñado exactamente para eso.
- ¿Qué pasa si una API externa falla?
- Puedes manejar errores, retries y excepciones de forma controlada.
Conclusión: cuándo y cómo usar el cliente HTTP de Laravel
El cliente HTTP de Laravel es una de las mejores decisiones del framework para trabajar con APIs. En mi experiencia, sustituye con ventaja a Guzzle directo, mejora la calidad del código y reduce errores en producción.
Si consumes APIs externas de forma habitual, aprenderlo bien es casi obligatorio.
Así que, así de fácil puedes emplear o enviar peticiones HTTP empleando Laravel con el nuevo esquema que tenemos interno al framework, como puedes ver, es mucho más sencillo y limpio al esquema que teníamos anteriormente, ya con esto puedes interconectar sistemas y evaluar las respuestas sean JSON, un texto u otra cosa.
Siguiente paso, aprende a usar la paginación en Laravel.