Что такое Guzzle и зачем он нужен?
Guzzle — это мощная PHP-библиотека для работы с HTTP-запросами. Она предоставляет удобный интерфейс для отправки HTTP-запросов, обработки ответов, работы с куками, сессиями, асинхронными запросами и многим другим. Если вы работаете с API, парсите веб-страницы или просто взаимодействуете с удалёнными серверами, Guzzle станет вашим незаменимым инструментом.
Основные возможности Guzzle:
- Поддержка всех HTTP-методов (GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS)
- Работа с заголовками, телом запроса, параметрами URL
- Поддержка асинхронных запросов (Promise-based)
- Автоматическая обработка перенаправлений (редиректов)
- Работа с куками и сессиями
- Middleware для расширения функциональности
- Поддержка PSR-7 (PSR-7 интерфейсы для HTTP-сообщений)
- Простое тестирование и мокирование
Guzzle используется в таких крупных проектах, как Laravel (встроенный HTTP-клиент), Drupal, Magento и многих других.
Установка
Установка Guzzle осуществляется через Composer — менеджер зависимостей для PHP. Если у вас ещё нет Composer, установите его с официального сайта getcomposer.org.
Выполните команду в терминале в корне вашего проекта:
composer require guzzlehttp/guzzle
После установки подключите автозагрузчик Composer в вашем PHP-файле:
require 'vendor/autoload.php';
Теперь вы готовы к работе с Guzzle.
Быстрый старт
Давайте отправим простой GET-запрос к публичному API и получим данные в формате JSON.
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
$client = new Client();
$response = $client->get('https://jsonplaceholder.typicode.com/posts/1');
// Получаем тело ответа
$body = $response->getBody();
// Преобразуем JSON в массив
$data = json_decode($body, true);
echo "Title: " . $data['title'] . "\n";
echo "Body: " . $data['body'] . "\n";
?>
Этот пример показывает, как легко можно получить данные с удалённого сервера. Guzzle автоматически обрабатывает заголовки, статус-коды и тело ответа.
Основные методы и функции
1. get() — GET-запрос
Что делает: Отправляет HTTP GET-запрос к указанному URL. Используется для получения данных.
Параметры:
$uri(string) — URL запроса$options(array) — массив опций (заголовки, query-параметры, таймауты и т.д.)
Пример:
<?php
$client = new GuzzleHttp\Client();
$response = $client->get('https://api.github.com/users/octocat', [
'headers' => [
'Accept' => 'application/json',
'User-Agent' => 'Guzzle-Demo'
],
'query' => [
'page' => 1,
'per_page' => 10
]
]);
echo $response->getStatusCode(); // 200
echo $response->getBody();
?>
2. post() — POST-запрос
Что делает: Отправляет POST-запрос. Используется для создания новых ресурсов или отправки данных на сервер.
Параметры:
$uri(string) — URL запроса$options(array) — массив опций (body, form_params, json, multipart и т.д.)
Пример:
<?php
$client = new GuzzleHttp\Client();
$response = $client->post('https://jsonplaceholder.typicode.com/posts', [
'json' => [
'title' => 'Новый пост',
'body' => 'Содержимое поста',
'userId' => 1
]
]);
echo $response->getStatusCode(); // 201
$data = json_decode($response->getBody(), true);
print_r($data);
?>
3. put() — PUT-запрос
Что делает: Отправляет PUT-запрос для полного обновления ресурса.
Параметры:
$uri(string) — URL запроса$options(array) — массив опций
Пример:
<?php
$client = new GuzzleHttp\Client();
$response = $client->put('https://jsonplaceholder.typicode.com/posts/1', [
'json' => [
'id' => 1,
'title' => 'Обновлённый заголовок',
'body' => 'Новое содержимое',
'userId' => 1
]
]);
echo $response->getStatusCode(); // 200
?>
4. patch() — PATCH-запрос
Что делает: Отправляет PATCH-запрос для частичного обновления ресурса.
Параметры:
$uri(string) — URL запроса$options(array) — массив опций
Пример:
<?php
$client = new GuzzleHttp\Client();
$response = $client->patch('https://jsonplaceholder.typicode.com/posts/1', [
'json' => [
'title' => 'Только заголовок изменён'
]
]);
echo $response->getStatusCode(); // 200
?>
5. delete() — DELETE-запрос
Что делает: Отправляет DELETE-запрос для удаления ресурса.
Параметры:
$uri(string) — URL запроса$options(array) — массив опций
Пример:
<?php
$client = new GuzzleHttp\Client();
$response = $client->delete('https://jsonplaceholder.typicode.com/posts/1');
echo $response->getStatusCode(); // 200
?>
6. head() — HEAD-запрос
Что делает: Отправляет HEAD-запрос, который аналогичен GET, но возвращает только заголовки без тела ответа. Полезно для проверки существования ресурса или получения метаданных.
Параметры:
$uri(string) — URL запроса$options(array) — массив опций
Пример:
<?php
$client = new GuzzleHttp\Client();
$response = $client->head('https://jsonplaceholder.typicode.com/posts/1');
echo $response->getStatusCode(); // 200
echo $response->getHeaderLine('Content-Type'); // application/json; charset=utf-8
?>
7. options() — OPTIONS-запрос
Что делает: Отправляет OPTIONS-запрос для получения информации о поддерживаемых методах и опциях сервера.
Параметры:
$uri(string) — URL запроса$options(array) — массив опций
Пример:
<?php
$client = new GuzzleHttp\Client();
$response = $client->options('https://jsonplaceholder.typicode.com/posts');
echo $response->getHeaderLine('Allow'); // GET,HEAD,PUT,PATCH,POST,DELETE
?>
8. send() — Отправка произвольного запроса
Что делает: Позволяет отправить запрос с произвольным методом и полным контролем над всеми параметрами.
Параметры:
$request(Psr\Http\Message\RequestInterface) — объект запроса$options(array) — массив опций
Пример:
<?php
use GuzzleHttp\Psr7\Request;
$client = new GuzzleHttp\Client();
$request = new Request('GET', 'https://api.github.com/users/octocat');
$response = $client->send($request, [
'headers' => [
'Accept' => 'application/json'
]
]);
echo $response->getBody();
?>
9. request() — Универсальный метод
Что делает: Позволяет отправить запрос любого HTTP-метода, передав его название как строку.
Параметры:
$method(string) — HTTP метод (GET, POST, PUT и т.д.)$uri(string) — URL запроса$options(array) — массив опций
Пример:
<?php
$client = new GuzzleHttp\Client();
$response = $client->request('GET', 'https://jsonplaceholder.typicode.com/posts/1', [
'headers' => [
'Accept' => 'application/json'
]
]);
echo $response->getBody();
?>
10. getAsync() — Асинхронный GET-запрос
Что делает: Отправляет асинхронный GET-запрос, который не блокирует выполнение скрипта. Возвращает Promise, который можно разрешить позже.
Параметры:
$uri(string) — URL запроса$options(array) — массив опций
Пример:
<?php
$client = new GuzzleHttp\Client();
$promise = $client->getAsync('https://jsonplaceholder.typicode.com/posts/1');
// Выполняем другие задачи...
$response = $promise->wait();
echo $response->getBody();
?>
Реальный практический пример
Рассмотрим реальный сценарий: создание простого клиента для работы с GitHub API. Мы будем получать информацию о пользователе, список его репозиториев и создавать новый issue.
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
class GitHubClient
{
private $client;
private $token;
public function __construct($token = null)
{
$this->token = $token;
$this->client = new Client([
'base_uri' => 'https://api.github.com/',
'headers' => [
'Accept' => 'application/vnd.github.v3+json',
'User-Agent' => 'MyApp/1.0'
]
]);
}
public function getUser($username)
{
try {
$response = $this->client->get("users/{$username}");
return json_decode($response->getBody(), true);
} catch (RequestException $e) {
return ['error' =&