Guzzle - гибкий HTTP клиент для PHP
Если в проекте необходимо обратиться к сторонним сервисам или библиотекам, получить контент сразу с нескольких сайтов или распарсить сайт, предварительно получив его cookie, тогда для этого как нельзя лучше подойдет библиотека Guzzle.
Стоит упомянуть, что в PHP для этого уже есть расширение cURL, которое позволяет взаимодействовать с серверами по различным протоколам, посылать запросы, закачивать файлы. Guzzle по умолчанию использует это расширение, если cURL не установлен, Guzzle позволяет заменить HTTP обработчик.
Устанавливается Guzzle через composer. В файле composer.json добавляем в зависимости библиотеку:
{
"name": "project name",
"require": {
"guzzlehttp/guzzle": "6.*"
}
}
Сохраняем файл и выполняем команду composer install.
Теперь, после загрузки библиотеки, можно ее инициализировать:
require_once 'vendor/autoload.php';
use GuzzleHttp\Client;
/** @var $client Client */
$client = new Client('http://site.ru');
При инициализации мы передаем адрес домена, к которому хотим подключиться. Далее выбираем тип запроса и отправляем его:
require_once 'vendor/autoload.php';
use GuzzleHttp\Client;
/** @var $client Client */
$client = new Client('http://site.ru');
/** @var $request \GuzzleHttp\Psr7\Request */
$request = $client->get('/api?param=test');
/** @var $response \GuzzleHttp\Psr7\Response */
$response = $request->send();
В приведенном выше коде мы отправили GET запрос по адресу http://site.ru/api?param=test.
Тип запроса соответствует названиям метода. Например, для GET - это будет $client→get(), для POST - $client→post(), для PUT - $client→put() и так далее.
Но, ведь после отправки нам нужен ответ от сервера, не так ли? Его можно получить методом $response→getBody(). А методом $response→getStatusCode() - код ответа сервера:
/** @var $response Response */
$response = $request->send();
if ($response->getStatusCode() === 200)
{
$body = $response->getBody();
}
$response→getBody() возвращает поток. Чтобы вывести содержимое в виде строки, нужно использовать метод $body→getContents(). Также можно прочитать побайтово через метод $body→read(). А вот метод $body→seek() переводит указатель на нужную позицию в потоке. Например:
/** @var $response Response */
$response = $request->send();
if ($response->getStatusCode() === 200)
{
$body = $response->getBody();
if ($body->read(5) == '<?xml')
{
echo 'Файл размечен как xml';
}
$body->seek(0); // вернет указатель в начало
echo $body->getContents(); // выведет результат запроса в строку
}
Подводя итоги, хочу сказать, что эта небольшая демонстрация только верхушка айсберга и того, на что способен Guzzle. Структурированная система плагинов, запросов и механизмов обработки ответа делает его гибким HTTP клиентом для PHP.