Cómo utilizar Guzzle: un cliente HTTP PHP para enviar solicitudes HTTP
El desarrollador siempre se encuentra con una tarea en la que necesita enviar solicitudes HTTP a otros recursos y manejar la respuesta. La forma popular de realizar estas tareas es mediante el uso de un cURL. Sin embargo, usar cURL no es relativamente fácil para un principiante. Además, para escribir un script en cURL, su servidor debería haber habilitado la extensión cURL.
Guzzle es una alternativa a cURL. Es un cliente HTTP de PHP que facilita el envío de solicitudes HTTP y simplifica la integración con los servicios web. Incluso, puedo decir por mi experiencia que Guzzle es mejor que cURL. Es simple y fácil de usar. Si está utilizando Guzzle, no necesita tener la extensión cURL en su servidor. Le brinda un mejor formato de código en comparación con cURL.
Dicho esto, veamos cómo usar Guzzle en su aplicación.
Instalación
La forma recomendada de instalar Guzzle es a través de Composer. Si no ha instalado Composer en su sistema, puede obtenerlo desde aquí.
Abra la terminal en el directorio raíz de su proyecto y ejecute el siguiente comando para instalar Guzzle.
composer require guzzlehttp/guzzle
Guzzle proporciona soporte para todas las solicitudes HTTP que son GET, DELETE, HEAD, OPTIONS, PATCH, POST y PUT. En este tutorial, estudiamos cómo usar Guzzle para enviar solicitudes HTTP y manejar respuestas con él.
Como ejemplo, tomo el servicio REQ | RES que proporciona una API real falsa para probar solicitudes HTTP.
Cómo enviar una solicitud HTTP usando Guzzle
Tras la instalación de la biblioteca Guzzle, debe incluir un entorno Guzzle en su archivo de la siguiente manera.
<?php
require_once "vendor/autoload.php";
use GuzzleHttpClient;
Ahora intentemos algunas operaciones una por una como GET, POST, carga de archivo, copia de archivo de URL remota a un directorio local, PUT, PATCH y DELETE.
OBTENER Solicitud usando Guzzle
Si observa el sitio web de REQ | RES, proporcionaron algunos puntos finales para las solicitudes ‘GET’. Tomaré el ejemplo del punto final ‘LIST USERS’. Para obtener la lista de usuarios, solicitan enviar una solicitud GET a este punto final https://reqres.in/api/users?page=2.
En Guzzle, enviaremos esta solicitud GET de la siguiente manera.
<?php
require_once "vendor/autoload.php";
use GuzzleHttpClient;
$client = new Client([
// Base URI is used with relative requests
'base_uri' => 'https://reqres.in',
]);
$response = $client->request('GET', '/api/users', [
'query' => [
'page' => '2',
]
]);
//get status code using $response->getStatusCode();
$body = $response->getBody();
$arr_body = json_decode($body);
print_r($arr_body);
Primero extraje un ‘base_uri’ (URL común) como https://reqres.in. Aquí, el extremo final es ‘/ api / users’ y requiere un parámetro GET como ‘página’. En Guzzle, puede enviar parámetros GET utilizando la matriz ‘consulta’ como se muestra en el código anterior.
Solicitud POST usando Guzzle
Normalmente, existen 2 tipos de solicitudes POST. Es posible que necesite POST parámetros como solicitud POST ‘application / x-www-form-urlencoded’ o cargar datos codificados JSON como un cuerpo de la solicitud. Puede publicar datos codificados en JSON como se muestra a continuación.
<?php
require_once "vendor/autoload.php";
use GuzzleHttpClient;
$client = new Client([
// Base URI is used with relative requests
'base_uri' => 'https://reqres.in',
]);
$response = $client->request('POST', '/api/users', [
'json' => [
'name' => 'Sam',
'job' => 'Developer'
]
]);
//get status code using $response->getStatusCode();
$body = $response->getBody();
$arr_body = json_decode($body);
print_r($arr_body);
En el caso de la solicitud POST ‘application / x-www-form-urlencoded’, puede POST parámetros de la siguiente manera.
<?php
require_once "vendor/autoload.php";
use GuzzleHttpClient;
$client = new Client([
// Base URI is used with relative requests
'base_uri' => 'BASE_URL_ENDPOINT',
]);
$client->request('POST', '/endpoint_here', [
'form_params' => [
'foo' => 'bar',
'baz' => ['hi', 'there!']
]
]);
En algunos casos, los puntos finales de la API le piden que envíe un token de autorización en cada solicitud HTTP. El usuario puede enviar este token como encabezados en su solicitud de Guzzle.
<?php
$client->request('POST', '/endpoint_here', [
"headers" => [
"Authorization" => "Bearer TOKEN_VALUE"
],
'form_params' => [
'foo' => 'bar',
'baz' => ['hi', 'there!']
]
]);
Copie el archivo desde el servidor remoto usando Guzzle
Si está buscando copiar un archivo desde un servidor remoto a su directorio local, Guzzle será una mejor opción. Supongamos que desea copiar esta imagen en https://artisansweb.net/wp-content/uploads/2020/03/blog.jpg como ‘blog.jpg’ en su directorio local. Escribiremos el código como se muestra a continuación.
<?php
require_once "vendor/autoload.php";
use GuzzleHttpClient;
$fp = fopen('blog.jpg', 'wb');
$client = new GuzzleHttpClient();
$request = $client->get('https://artisansweb.net/wp-content/uploads/2020/03/blog.jpg', ['sink' => $fp]);
fclose($fp);
Carga de archivos usando Guzzle
Como todos sabemos, para cargar archivos necesitamos establecer el cuerpo de la solicitud en un formulario ‘multipart / form-data’. El código básico en Guzzle para cargar archivos se escribiría como se muestra a continuación.
<?php
require_once "vendor/autoload.php";
use GuzzleHttpClient;
$client = new Client([
// Base URI is used with relative requests
'base_uri' => 'BASE_URL_HERE',
]);
$client->request('POST', '/endpoint_here', [
'multipart' => [
[
'name' => 'files', // name value requires by endpoint
'contents' => fopen('/path/to/file', 'r'),
'filename' => 'custom_image.jpg'
],
]
]);
Para demostrar la carga del archivo, tomaré un ejemplo en vivo de la API reSmush.it que envía una versión optimizada de la imagen en respuesta. Necesita PUBLICAR su imagen en su punto final. El código para usar Guzzle de la siguiente manera.
<?php
require_once "vendor/autoload.php";
use GuzzleHttpClient;
try {
$client = new Client([
// Base URI is used with relative requests
'base_uri' => 'http://api.resmush.it',
]);
$response = $client->request('POST', "?qlty=92", [
'multipart' => [
[
'name' => 'files', // name value requires by endpoint
'contents' => fopen(getcwd().'/blog.jpg', 'r'),
'filename' => 'blog.jpg',
'headers' => array('Content-Type' => mime_content_type(getcwd().'/blog.jpg'))
]
]
]);
if (200 == $response->getStatusCode()) {
$response = $response->getBody();
$arr_result = json_decode($response);
print_r($arr_result);
}
} catch (Exception $e) {
echo $e->getMessage();
}
PUT, PATCH y DELETE Request usando Guzzle
Las solicitudes PUT y PATCH se utilizan para actualizar los recursos. Sin embargo, estas 2 solicitudes lo hacen de manera diferente.
PUT sobrescribe toda la entidad si ya existe y crea un nuevo recurso si no existe. Si desea actualizar el nombre de una persona, debe enviar el recurso completo al realizar una solicitud PUT.
<?php
<?php
require_once "vendor/autoload.php";
use GuzzleHttpClient;
$client = new Client([
// Base URI is used with relative requests
'base_uri' => 'https://reqres.in',
]);
$response = $client->request('PUT', '/api/users/2', [
'json' => [
'name' => 'Sam',
'job' => 'Developer'
]
]);
//get status code using $response->getStatusCode();
$body = $response->getBody();
$arr_body = json_decode($body);
print_r($arr_body);
La solicitud PATCH aplica una actualización parcial al recurso. Significa que solo debe enviar los datos que desea actualizar y no afectará ni cambiará nada más. Entonces, si desea actualizar el nombre de una persona, solo se le pedirá que envíe el parámetro de nombre.
<?php
require_once "vendor/autoload.php";
use GuzzleHttpClient;
$client = new Client([
// Base URI is used with relative requests
'base_uri' => 'https://reqres.in',
]);
$response = $client->request('PATCH', '/api/users/2', [
'json' => [
'name' => 'Sam',
]
]);
//get status code using $response->getStatusCode();
$body = $response->getBody();
$arr_body = json_decode($body);
print_r($arr_body);
Una solicitud DELETE es sencilla. Solo necesita llegar al punto final de la siguiente manera.
<?php
require_once "vendor/autoload.php";
use GuzzleHttpClient;
$client = new Client([
// Base URI is used with relative requests
'base_uri' => 'https://reqres.in',
]);
$response = $client->request('DELETE', '/api/users/2');
echo $response->getStatusCode(); //should gives 204
Espero que conozcas Guzzle y los conceptos básicos de cómo usarlo. Puede leer más sobre las opciones de solicitud de Guzzle en su documentación. Comparta sus pensamientos o sugerencias en la sección de comentarios a continuación.
Artículos relacionados
- API de YouTube: cómo obtener una lista de videos de YouTube de su canal
- TinyPNG Comprimir imágenes usando PHP
- Validación de formularios HTML con perejil