Cliente HTTP de Laravel, primeras conexiones y manejo básico de excepciones

El cliente HTTP de Laravel es una característica incorporada  el framework que permite hacer solicitudes HTTP desde tu aplicación Laravel; con esto, podemos contectarnos a cualquier sistema o API basado en HTTP o que pueda recibir peticiones HTTP; estas peticiones pueden ser de los tipos básicos soportados por HTTP como GET, POST, PUT, DELETE el cliente de Laravel proporciona un canal fácil de itilizar e intuitiva para hacer este tipo de peticiones; esta biblioteca se llama como Guzzle PHP; la cual. proporciona una amplia gama de funciones para manejar estas solicitudes HTTP ya que, no todo es tan facil como realizar la consulta, puede que necesites estar autenticado, manejar tokens, el tiempo de la peticiones, los tipos de respuestas, embacezados y un largo etc de elementos que puedes personalizar. Luego, se puede capturar la respuesta y manejarla como desees dentro de la aplicación.

Cliente HTTP de Laravel en la práctica

Vamos a conocer como podemos enviar peticiones HTTP en Laravel, estas peticiones que puedes enviar son de tipo CRUD para los métodos de tipo get, put, patch delete y por supuesto post; podemos enviar peticiones a cualquier otro sistema que nos permita claro está hacer este tipo de peticiones e interconectar aplicaciones; no importa si es un sistema propio o no, siempre podemos enviar peticiones y hacer algo con esta data, ya sea la data un json, texto, una página HTML, una imagen, videos... etc etc etc.

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 codigo 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();

Y bueno, podemos hacer cualquier cosa: el problema es, si es que existe un problema, es que la sintaxis no es del todo limpia, nos recuerda mucho a PHP puro y duro y nosotros que empleemos Laravel nos gusta las cosas mas organizadas, mejor legibilidad, escalabilidad y que joder se pueda leer sin tanto rollo... para eso, Laravel ahora tiene un paquete nativo integrado por defecto en el framework, ya que el anterior es un paquete que viene instalado por defecto y puedes ver el mismo en tu 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.

Recuerda que todo este material forma parte de mi curso y libro completo sobre Laravel.

- Andrés Cruz

In english
Andrés Cruz

Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter

Andrés Cruz En Udemy

Acepto recibir anuncios de interes sobre este Blog.