Как использовать Guzzle – HTTP-клиент PHP для отправки HTTP-запросов
Разработчик всегда сталкивается с задачей, когда ему нужно отправить HTTP-запросы другим ресурсам и обработать ответ. Популярный способ выполнения этих задач – использование cURL. Однако использовать cURL для новичка не так-то просто. Также, чтобы написать сценарий на cURL, на вашем сервере должно быть включено расширение cURL.
Guzzle – альтернатива cURL. Это HTTP-клиент PHP, который упрощает отправку HTTP-запросов и упрощает интеграцию с веб-службами. Даже по своему опыту могу сказать, что Guzzle лучше, чем cURL. Это просто и удобно. Если вы используете Guzzle, вам не нужно иметь расширение cURL на вашем сервере. Это дает вам лучшее форматирование кода по сравнению с cURL.
При этом давайте посмотрим, как использовать Guzzle в вашем приложении.
Монтаж
Рекомендуемый способ установки Guzzle – через Composer. Если вы не установили Composer в своей системе, вы можете получить его отсюда.
Откройте терминал в корневом каталоге вашего проекта и выполните приведенную ниже команду, чтобы установить Guzzle.
composer require guzzlehttp/guzzle
Guzzle поддерживает все HTTP-запросы: GET, DELETE, HEAD, OPTIONS, PATCH, POST и PUT. В этом руководстве мы изучаем, как использовать Guzzle для отправки HTTP-запросов и обработки ответов с его помощью.
В качестве примера я возьму сервис REQ | RES, который предоставляет поддельный реальный API для тестирования HTTP-запросов.
Как отправить HTTP-запрос с помощью Guzzle
После установки библиотеки Guzzle вам необходимо включить среду Guzzle в свой файл следующим образом.
<?php
require_once "vendor/autoload.php";
use GuzzleHttpClient;
Теперь давайте попробуем выполнить несколько операций одну за другой, такие как GET, POST, загрузка файла, копирование файла с удаленного URL-адреса в локальный каталог, PUT, PATCH и DELETE.
Получить запрос с помощью Guzzle
Если вы посмотрите на веб-сайт REQ | RES, они предоставили несколько конечных точек для запросов GET. Я возьму пример конечной точки «СПИСОК ПОЛЬЗОВАТЕЛЕЙ». Для получения списка пользователей они просят отправить запрос GET на эту конечную точку https://reqres.in/api/users?page=2.
В Guzzle мы отправим этот GET-запрос следующим образом.
<?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);
Сначала я извлек base_uri (общий URL) как https://reqres.in. Здесь последняя конечная точка – «/ api / users», и для нее требуется параметр GET в качестве «страницы». В Guzzle вы можете отправлять GET-параметры, используя массив запросов, как показано в приведенном выше коде.
POST-запрос с использованием Guzzle
Обычно существует 2 типа запросов POST. Вам может потребоваться отправить параметры POST как POST-запрос application / x-www-form-urlencoded или загрузить данные в кодировке JSON в качестве тела запроса. Вы можете публиковать данные в кодировке JSON, как показано ниже.
<?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);
В случае запроса POST ‘application / x-www-form-urlencoded’ вы можете задать параметры POST следующим образом.
<?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!']
]
]);
В некоторых случаях конечные точки API просят вас отправлять токен авторизации в каждом HTTP-запросе. Пользователь может отправить этот токен в виде заголовков в вашем запросе Guzzle.
<?php
$client->request('POST', '/endpoint_here', [
"headers" => [
"Authorization" => "Bearer TOKEN_VALUE"
],
'form_params' => [
'foo' => 'bar',
'baz' => ['hi', 'there!']
]
]);
Скопируйте файл с удаленного сервера с помощью Guzzle
Если вы хотите скопировать файл с удаленного сервера в свой локальный каталог, Guzzle будет лучшим вариантом. Допустим, вы хотите скопировать это изображение с https://artisansweb.net/wp-content/uploads/2020/03/blog.jpg как «blog.jpg» в свой локальный каталог. Мы напишем для него код, как показано ниже.
<?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);
Загрузка файла с помощью Guzzle
Как мы все знаем, для загрузки файлов нам нужно установить тело запроса в форму multipart / form-data. Базовый код в Guzzle для загрузки файлов будет выглядеть так, как показано ниже.
<?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'
],
]
]);
Чтобы продемонстрировать загрузку файла, я возьму живой пример API reSmush.it, который в ответ отправляет оптимизированную версию изображения. Вам нужно отправить свое изображение на их конечную точку. Код для этого с использованием Guzzle выглядит следующим образом.
<?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 и DELETE с использованием Guzzle
Запросы PUT и PATCH используются для обновления ресурсов. Однако эти 2 запроса делают это по-разному.
PUT перезаписывает весь объект, если он уже существует, и создает новый ресурс, если он не существует. Если вы хотите обновить имя человека, вам нужно отправить весь ресурс при выполнении запроса 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);
Запрос PATCH применяет частичное обновление к ресурсу. Это означает, что вам нужно только отправить данные, которые вы хотите обновить, и это не повлияет и не изменит что-либо еще. Поэтому, если вы хотите обновить имя человека, вам потребуется только отправить параметр имени.
<?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);
Запрос DELETE прост. Вам просто нужно попасть в конечную точку следующим образом.
<?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
Надеюсь, вы узнали о Guzzle и об основах его использования. Вы можете узнать больше о параметрах запроса Guzzle в их документации. Пожалуйста, поделитесь своими мыслями или предложениями в разделе комментариев ниже.
Статьи по Теме
- YouTube API – как получить список YouTube-видео вашего канала
- TinyPNG сжимает изображения с помощью PHP
- Проверка HTML-формы с помощью петрушки