Cómo usar el cliente incorporado de Laravel para interactuar con API externas

Publicado: 2023-04-24

Laravel hace que las interacciones de la API sean muy sencillas tanto para los desarrolladores web nuevos como para los experimentados. El cliente HTTP Larvel se basa en el cliente HTTP Guzzle de PHP para brindar a los desarrolladores una experiencia más fluida al realizar solicitudes HTTP. Sus características principales incluyen autenticación, enrutamiento y mapeo relacional de objetos (ORM) efectivo.

Este artículo explorará el uso del cliente HTTP de Laravel para realizar solicitudes, depurar respuestas, crear middleware y macros, y más.

El cliente HTTP de Laravel hace el trabajo duro por usted para las API

Guzzle es un cliente HTTP simple para PHP. Ofrece funcionalidad para diferentes solicitudes de formulario, incluidas GET , POST , PUT y DELETE junto con las capacidades de transmisión y solicitudes de varias partes. Con el cliente HTTP Guzzle, es posible enviar solicitudes síncronas y asíncronas al servidor. Además, también viene con un middleware decente para personalizar el comportamiento del cliente.

El cliente HTTP de Laravel es un contenedor creado en Guzzle pero con funcionalidades adicionales. Incluye soporte para reintentar solicitudes fallidas y algunas funciones auxiliares con datos JSON. La mayoría de las funcionalidades de los clientes HTTP de Laravel son similares a Guzzle.

¡Aproveche al máximo el cliente integrado de Laravel para interacciones API! ¿Nuevo en las API? Esta guía lo tiene cubierto Haga clic para twittear

requisitos previos

En las siguientes secciones, aprenderá más sobre el cliente HTTP de Laravel. Para seguir, necesitarás:

  • Conocimientos básicos de Laravel, PHP y APIs
  • PHP y Composer instalados
  • Cartero

Cómo hacer solicitudes

Para comprender cómo usar un cliente HTTP para realizar una solicitud, puede aprovechar muchas API alojadas, como ReqRes.

Comience importando el paquete HTTP incluido al crear la aplicación. Dentro del archivo App/Http/Controllers/UserController.php , agregue el siguiente código, comenzando con la declaración de uso al principio del archivo y el código restante dentro de la función de índice.

 use Illuminate\Support\Facades\Http; return Http::get("https://reqres.in/api/users?page=2");

Nota: Para casos de uso complejos, también puede enviar la solicitud con encabezados utilizando el método withHeaders .

En el mismo archivo, cree una nueva publicación de método usando el siguiente código:

 function post() { $response = Http::withHeaders([ 'Content-Type' => 'application/json', ])->post('https://reqres.in/api/users', [ 'name' => 'morpheus', 'job' => 'leader', ]); return $response; }

Luego agregue una ruta para ello dentro del archivo route/web.php :

 Route::get('post',[UserController::class,'post']);

Ahora, Postman se puede usar para probar esta ruta. Abra Postman y agregue http://127.0.0.1:8000/post como URL, con el tipo de solicitud GET . Una vez que haga clic en enviar , verá la siguiente respuesta:

Hacer solicitudes usando Postman
Hacer solicitudes usando Postman

Solicitudes concurrentes

Las solicitudes paralelas mejoran significativamente el rendimiento, ya que puede obtener más datos en el mismo período. El cliente HTTP de Laravel permite realizar solicitudes concurrentes utilizando el método pool.

Dentro de App/Http/Controllers/UserController.php , agregue el siguiente código:

 use Illuminate\Http\Client\Pool; function concurrent() { $responses = Http::pool(fn (Pool $pool) => [ $pool->get('https://reqres.in/api/users?page=2'), $pool->get('https://reqres.in/api/users/2'), $pool->get('https://reqres.in/api/users?page=2'), ]); return $responses[0]->ok() && $responses[1]->ok() && $responses[2]->ok(); }

Luego, agregue la ruta de soporte dentro del archivo route/web.php .

 Route::get('concurrent',[UserController::class,'concurrent']);

El navegador da la siguiente respuesta cuando se visita la ruta:

Solicitudes concurrentes
Solicitudes concurrentes

Solicitar macros

Las macros de solicitud son útiles al interactuar con rutas API comunes.

Para crear la macro, debe definir la macro dentro del método de inicio del archivo app/Http/Providers/AppServiceProvider.php usando el siguiente código:

 use Illuminate\Support\Facades\Http; Http::macro('reqres', function () { return Http::baseUrl('https://reqres.in/api'); });

Nota: asegúrese de agregar la declaración de uso al principio del archivo.

Luego, use la macro dentro del UserController agregando el siguiente código:

 function macro() { $response = Http::reqres()->get('/users?page=2'); return $response; }

Como puede ver, debido a que la macro ya se está creando, no es necesario que vuelva a agregar la URL completa.

Por último, agregue una ruta en el archivo route/web.php usando el siguiente código:

 Route::get('macro',[UserController::class,'macro']);
Solicitud de macros
Solicitud de macros

Cómo decodificar respuestas

Para decodificar una respuesta y asegurarse de que una solicitud de API se realice correctamente, utilice el método de estado incluido en el cliente. Este método obtiene el código de estado enviado desde el servidor y lo muestra.

Para probar esto, reemplace el código de macro anterior con el siguiente código dentro del archivo App/Http/Controllers/UserController.php :

 function macro() { $response = Http::reqres()->get('/users?page=2'); return $response->status(); }

Aquí, el código de estado 200 significa que la solicitud fue exitosa.

Respuesta de decodificación exitosa
Respuesta de decodificación exitosa

Cómo probar las API de JSON

Laravel tiene varios ayudantes para probar las API de JSON y sus respuestas. Las funciones auxiliares incluyen json , getJson , postJson , putJson , patchJson , deleteJson , etc.

Para comprender mejor las pruebas, cree un escenario de prueba para la ruta del usuario GET . Cuando inicia la aplicación Laravel, la prueba de ejemplo ya está creada. Dentro del archivo tests/Feature/ExampleTest.php , reemplace el código existente con lo siguiente:

 <?php namespace Tests\Feature; use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; class ExampleTest extends TestCase { /** * A basic test example. * * @return void */ public function test_example() { $response = $this->getJson('/users'); $response->assertStatus(200); } }

El código agregado obtiene los datos JSON en la ruta del usuario y verifica si el código de estado es 200 o no.

Una vez que haya agregado el código de prueba, ejecute el siguiente comando en su terminal para ejecutar las pruebas:

 ./vendor/bin/phpunit

Una vez que se completen las pruebas, verá que ejecutó dos pruebas, ambas exitosas.

Probar las API de JSON
Probar las API de JSON

Del mismo modo, puede verificar diferentes tipos de solicitudes y utilizar otros métodos auxiliares para realizar pruebas más sofisticadas.

Cómo manejar eventos

Laravel ofrece tres eventos para disparar cuando se trata de solicitudes HTTP.

  • RequestSending , que es antes de que se envíe la solicitud.
  • ResponseReceived , que es cuando se recibe una respuesta.
  • ConnectionFailed , que es cuando no se recibe respuesta.

Los tres eventos incluyen la propiedad $request para inspeccionar la instancia Illuminate\Http\Client\Request , y ResponseReceived tiene una $response property adicional. Estos son particularmente útiles para realizar acciones después de un evento. Por ejemplo, es posible que desee enviar un correo electrónico después de obtener una respuesta satisfactoria.

Para crear un evento y un oyente, vaya al archivo app/Providers/EventServiceProvider.php y reemplace la matriz de escucha con el siguiente código.

 protected $listen = [ Registered::class => [ SendEmailVerificationNotification::class, ], 'Illuminate\Http\Client\Events\ResponseReceived' => [ 'App\Listeners\LogResponseReceived', ], ];

Luego ejecuta el siguiente comando en tu terminal:

 php artisan event:generate

El comando anterior creará el oyente app/Listeners/LogResponseReceived.php . Reemplace el código de ese archivo con el siguiente código:

 <?php namespace App\Listeners; use Illuminate\Http\Client\Events\ResponseReceived; use Illuminate\Http\Request; use Illuminate\Http\Response; use Illuminate\Support\Facades\Log; class LogResponseReceived { /** * Create the event listener. * * @return void */ public function __construct(Request $request, Response $response) { Log::channel('stderr')->info($response->status()); } /** * Handle the event. * * @param \Illuminate\Http\Client\Events\ResponseReceived $event * @return void */ public function handle(ResponseReceived $event) { } }

El registro de información del código de estado se imprime en el terminal.

Registros de terminal que muestran el código de estado
Registros de terminal que muestran el código de estado

Combine el poder de Laravel y Guzzle para una experiencia API perfecta. ¿Listo para mejorar tus habilidades de desarrollo web? Comience aquí Haga clic para twittear

Resumen

Ya sea que un sitio web o una aplicación web sea creado por una organización o un desarrollador independiente, las API son clave para su éxito. Sin embargo, usarlos puede ser difícil.

Muchos marcos y bibliotecas prometen simplificar este proceso, pero Laravel se destaca por su enfoque en la simplicidad y la facilidad de uso. Su cliente integrado admite llamadas de API sencillas, llamadas de API simultáneas, macros de API, métodos auxiliares para API basadas en JSON y más.