WEB и WordPress новости, темы, плагины. Здесь мы делимся советами и лучшими решениями для сайтов.

Как использовать Guzzle – HTTP-клиент PHP для отправки HTTP-запросов

1 262

Разработчик всегда сталкивается с задачей, когда ему нужно отправить HTTP-запросы другим ресурсам и обработать ответ. Популярный способ выполнения этих задач – использование cURL. Однако использовать cURL для новичка не так-то просто. Также, чтобы написать сценарий на cURL, на вашем сервере должно быть включено расширение cURL.

Guzzle – альтернатива cURL. Это HTTP-клиент PHP, который упрощает отправку HTTP-запросов и упрощает интеграцию с веб-службами. Даже по своему опыту могу сказать, что Guzzle лучше, чем cURL. Это просто и удобно. Если вы используете Guzzle, вам не нужно иметь расширение cURL на вашем сервере. Это дает вам лучшее форматирование кода по сравнению с cURL.

При этом давайте посмотрим, как использовать Guzzle в вашем приложении.

Монтаж

Рекомендуемый способ установки Guzzle – через Composer. Если вы не установили Composer в своей системе, вы можете получить его отсюда.

Как использовать Guzzle - HTTP-клиент PHP для отправки HTTP-запросов

Откройте терминал в корневом каталоге вашего проекта и выполните приведенную ниже команду, чтобы установить 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 в их документации. Пожалуйста, поделитесь своими мыслями или предложениями в разделе комментариев ниже.

Статьи по Теме

Источник записи: artisansweb.net

Этот веб-сайт использует файлы cookie для улучшения вашего опыта. Мы предполагаем, что вы согласны с этим, но вы можете отказаться, если хотите. Принимаю Подробнее