Введение: зачем нужен 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