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

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

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

Начать курс

Введение

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

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

1. Простейший способ: file_get_contents

Самый быстрый способ отправить GET-запрос на PHP — использовать функцию file_get_contents() с указанием URL. Однако этот метод имеет серьезные ограничения.

Простой GET-запрос

<?php
$url = 'https://api.example.com/users';
$response = file_get_contents($url);
if ($response === false) {
    echo 'Ошибка при получении данных';
} else {
    echo $response;
}
?>

Добавление заголовков через stream context

Чтобы добавить заголовки или изменить метод запроса, нужно использовать stream_context_create():

<?php
$url = 'https://api.example.com/data';
$options = [
    'http' => [
        'method' => 'GET',
        'header' => "Accept: application/json\r\n" .
                     "Authorization: Bearer your-token\r\n"
    ]
];
$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);
if ($response === false) {
    echo 'Ошибка запроса';
} else {
    $data = json_decode($response, true);
    print_r($data);
}
?>

POST-запрос через file_get_contents

<?php
$url = 'https://api.example.com/create';
$data = ['name' => 'John', 'email' => 'john@example.com'];
$options = [
    'http' => [
        'method' => 'POST',
        'header' => "Content-Type: application/json\r\n",
        'content' => json_encode($data)
    ]
];
$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);
?>

Недостатки file_get_contents:

  • Нет поддержки таймаутов (по умолчанию ждет бесконечно)
  • Сложно обрабатывать ошибки соединения
  • Нет возможности скачивать файлы частями
  • Плохо подходит для сложных сценариев

2. Мощный инструмент: cURL

cURL — это стандартный инструмент для работы с HTTP в PHP. Он предоставляет полный контроль над запросами и поддерживает практически все возможности протокола.

Базовая инициализация и GET-запрос

<?php
$ch = curl_init('https://api.example.com/users');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'cURL error: ' . curl_error($ch);
} else {
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    echo "HTTP код: $httpCode\n";
    echo $response;
}
curl_close($ch);
?>

POST-запрос с данными

<?php
$ch = curl_init('https://api.example.com/users');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => json_encode([
        'name' => 'Jane Doe',
        'email' => 'jane@example.com'
    ]),
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/json',
        'Accept: application/json'
    ],
    CURLOPT_TIMEOUT => 30,
    CURLOPT_CONNECTTIMEOUT => 10
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($httpCode === 201) {
    echo 'Пользователь создан успешно';
} else {
    echo 'Ошибка: ' . $response;
}
?>

Работа с заголовками ответа

<?php
$ch = curl_init('https://api.example.com/resource');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HEADER => true,  // Включаем заголовки в ответ
    CURLOPT_NOBODY => false
]);
$response = curl_exec($ch);
$headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$headers = substr($response, 0, $headerSize);
$body = substr($response, $headerSize);
curl_close($ch);
?>

Отправка файла (multipart/form-data)

<?php
$ch = curl_init('https://api.example.com/upload');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => [
        'file' => new CURLFile('/path/to/file.pdf', 'application/pdf', 'document.pdf'),
        'description' => 'Важный документ'
    ]
]);
$response = curl_exec($ch);
curl_close($ch);
?>

Преимущества cURL:

  • Полный контроль над запросами
  • Поддержка таймаутов, редиректов, куки
  • Работа с разными протоколами (HTTP/2, FTP)
  • Эффективная работа с большими файлами

3. Современный подход: Guzzle

Guzzle — это мощная PHP HTTP-клиентская библиотека, которая предоставляет удобный интерфейс для работы с HTTP. Она абстрагирует сложность cURL и предлагает объектно-ориентированный подход.

Установка через Composer

composer require guzzlehttp/guzzle

Простой GET-запрос

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

use GuzzleHttp\Client;

$client = new Client([
    'base_uri' => 'https://api.example.com',
    'timeout                

Блоги

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