HTTP клиент на PHP: делаем запросы правильно от А до Я

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение: зачем нужен HTTP клиент на PHP?

Современная веб-разработка немыслима без взаимодействия с внешними сервисами. Будь то отправка данных на сторонний API, получение курса валют или интеграция с платежным шлюзом — каждый PHP-разработчик сталкивается с необходимостью выполнять HTTP-запросы. Создание надежного HTTP клиента на PHP — это базовая компетенция, которая позволяет вашему приложению общаться с остальным миром.

В этой статье мы разберем два основных подхода: использование встроенного расширения cURL и популярной библиотеки Guzzle. Вы узнаете, как правильно отправлять GET, POST, PUT и DELETE запросы, обрабатывать ошибки и работать с заголовками. Материал будет полезен как новичкам, так и опытным разработчикам, желающим систематизировать знания.

1. Основы HTTP клиента на PHP: работа с cURL

1.1. Что такое cURL и почему он важен

cURL (Client URL Library) — это мощное расширение PHP, которое позволяет взаимодействовать с различными серверами по протоколам HTTP, HTTPS, FTP и другим. Оно входит в стандартную поставку PHP, но иногда требует отдельной активации в php.ini. cURL дает полный контроль над запросом: вы можете задать любой метод, заголовки, тело запроса и таймауты.

1.2. Простой GET-запрос с cURL

Начнем с самого распространенного сценария — получение данных с сервера. Рассмотрим пример запроса к публичному API JSONPlaceholder:

<?php
// Инициализация сессии cURL
$ch = curl_init('https://jsonplaceholder.typicode.com/posts/1');

// Настройка опций
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPGET, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);

// Выполнение запроса
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

// Проверка на ошибки
if (curl_errno($ch)) {
    echo 'Ошибка cURL: ' . curl_error($ch);
} else {
    echo "HTTP код: $httpCode\n";
    $data = json_decode($response, true);
    print_r($data);
}

// Закрытие сессии
curl_close($ch);
?>

Обратите внимание: мы всегда проверяем код ответа и наличие ошибок. CURLOPT_RETURNTRANSFER гарантирует, что результат будет возвращен в переменную, а не выведен напрямую.

1.3. Отправка POST-запроса с данными

Для отправки данных на сервер (например, при создании новой записи) используем POST. Данные можно передавать как массив или JSON-строку:

<?php
$ch = curl_init('https://jsonplaceholder.typicode.com/posts');

$postData = [
    'title' => 'Новый пост',
    'body' => 'Содержимое поста',
    'userId' => 1
];

curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => json_encode($postData), // JSON
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/json',
        'Accept: application/json'
    ],
    CURLOPT_TIMEOUT => 30
]);

$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

echo "HTTP код: $httpCode\n";
echo $response;
?>

Ключевой момент: если вы передаете массив в CURLOPT_POSTFIELDS, PHP автоматически закодирует его как application/x-www-form-urlencoded. Для JSON нужно использовать json_encode() и явно указать заголовок Content-Type.

1.4. PUT и DELETE запросы

Для обновления и удаления ресурсов используются методы PUT и DELETE. В cURL они задаются через опцию CURLOPT_CUSTOMREQUEST:

<?php
// PUT запрос (обновление)
$ch = curl_init('https://jsonplaceholder.typicode.com/posts/1');
$updateData = ['title' => 'Обновленный заголовок'];

curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => 'PUT',
    CURLOPT_POSTFIELDS => json_encode($updateData),
    CURLOPT_HTTPHEADER => ['Content-Type: application/json']
]);

$response = curl_exec($ch);
curl_close($ch);

// DELETE запрос (удаление)
$ch = curl_init('https://jsonplaceholder.typicode.com/posts/1');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => 'DELETE'
]);

$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

echo "Код ответа при удалении: $httpCode";
?>

2. Современный подход: HTTP клиент на PHP с Guzzle

2.1. Установка и преимущества Guzzle

Guzzle — это PHP HTTP-клиент, который значительно упрощает работу с запросами. Он использует объектно-ориентированный подход, поддерживает PSR-7 (стандарт HTTP-сообщений) и автоматически обрабатывает многие технические детали. Установка производится через Composer:

composer require guzzlehttp/guzzle

Основные преимущества Guzzle: понятный синтаксис, встроенная обработка ошибок через исключения, поддержка асинхронных запросов и middleware.

2.2. GET и POST запросы с Guzzle

С Guzzle код становится лаконичным и читаемым. Вот примеры основных запросов:

<?php
require 'vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;

$client = new Client([
    'base_uri' => 'https://jsonplaceholder.typicode.com',
    'timeout' => 30,
    'headers' => [
        'Accept' => 'application/json'
    ]
]);

// GET запрос
try {
    $response = $client->get('/posts/1');
    $body = $response->getBody()->getContents();
    $data = json_decode($body, true);
    echo "Заголовок поста: " . $data['title'] . "\n";
} catch (RequestException $e) {
    echo "Ошибка: " . $e->getMessage();
}

// POST запрос
try {
    $response = $client->post('/posts                

Блоги

Рекомендаций по книгам