Cliente HTTP de Laravel, primeras conexiones y manejo básico de excepciones
Índice de contenido
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.
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.
Basado en Guzzle PHP
Esta biblioteca se basa en Guzzle PHP, la cual proporciona una amplia gama de funciones para manejar solicitudes HTTP. No todo es tan simple como realizar una consulta: puede que necesites estar autenticado, manejar tokens, controlar el tiempo de las peticiones, gestionar los tipos de respuestas, los encabezados y un largo etcétera de elementos que se pueden personalizar.
Manejo de Respuestas
Finalmente, 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.
Cliente HTTP de Laravel en la práctica
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.
Si revisamos la página oficial de Laravel que trata este tema en detalle:
https://laravel.com/docs/master/http-client
Verás que nos narran que empleaba un paquete llamado 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;Como puedes ver en las líneas anteriores, con esto podemos pasar inclusive parámetros, como segundo parámetro de la función que estemos empleando:
$response = Http::get('https://tuwebapi.com',['p1=> 1, ... 'px'=>100]);Y da igual si hacer una petición de tipo get o post..., solamente tienes que cambiar el método por el que quieras emplear y buala:
Http::post('https://jsonplaceholder.typicode.com/posts',[
'title' => 'foo 2',
'body' => 'bar',
'userId' => 1,
])Por supuesto, según el tipo de respuesta que esperes, puedes hacer la conversión; si es un JSON:
Http::post('https://jsonplaceholder.typicode.com/posts',[
'title' => 'foo 2',
'body' => 'bar',
'userId' => 1,
])->json()O si es otra cosa, puedes consumirlo desde el body:
Http::post('https://google.com,[
...
])->body()
Y hacer lo que quieras hacer con la respuesta; recuerda que puedes configurar más parámetros como los headers, preguntar el estatus y mucho más.
Route::get('/', function () {
try {
//code...
dd(Http::post('https://jsonplaceholder.typicode.com/posts',[
'title' => 'foo 2',
'body' => 'bar',
'userId' => 1,
])->json()['userId']);
} catch (\Illuminate\Http\Client\ConnectionException $e) {
//throw $th;
//report($e);
echo $e;
}
//return view('welcome');
});Control de excepciones
Opcionalmente, siempre es buena idea manejar las posibles excepciones que pueden ocurrir al momento de realizar las conexiones.
try catch
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...
Report para guardar en el log
Aunado a lo anterior, 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.
Conclusiones
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.
Acepto recibir anuncios de interes sobre este Blog.
Vamos a explicar como realizar la primera conexión realizando peticiones HTTP desde Laravel hacia otras APIs o sitios webs; lo cual es IMPRESINDIBLE para comunicar aplicaciones desde el lado del servidor.