Як користуватися Guzzle – клієнтом PHP HTTP для надсилання запитів HTTP
Розробник завжди стикається із завданням, де їм потрібно надсилати HTTP-запити на інші ресурси та обробляти відповідь. Популярним способом виконання цих завдань є використання curl. Однак використання curl не відносно просто для початківців. Крім того, щоб написати сценарій на cURL, ваш сервер повинен був увімкнути розширення cURL.
Guzzle – це альтернатива cURL. Це PHP-клієнт HTTP, який полегшує надсилання 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 цій кінцевій точці 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, використовуючи масив ‘query’, як показано в наведеному вище коді.
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);
Запит на ВИДАЛЕННЯ є прямим. Вам просто потрібно досягти кінцевої точки наступним чином.
<?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 в їх документації. Будь ласка, поділіться своїми думками чи пропозиціями у розділі коментарів нижче.
Пов’язані статті
- API YouTube – Як отримати список відео YouTube вашого каналу
- TinyPNG Стиснення зображень за допомогою PHP
- Перевірка форми HTML за допомогою петрушки