Работа с HTTP протоколом в PHP: от запроса к ответу

Раздел: Веб-программирование PHP -> HTTP протокол

Основы HTTP в PHP

Наиболее эффективный способ работы с HTTP запросами и ответами в PHP заключается в применении встроенных суперглобальных массивов для получения данных и функций header() и echo для формирования ответа. Такой подход не требует дополнительных библиотек и даёт полный контроль над процессом.

<?
// Получение метода запроса
$method = $_SERVER['REQUEST_METHOD'];

if ($method === 'POST') {
    $input = json_decode(file_get_contents('php://input'), true);
    $response = ['message' => 'Данные получены', 'data' => $input];
} else {
    $response = ['message' => 'Только POST метод поддерживается'];
}

header('Content-Type: application/json; charset=utf-8');
http_response_code($method === 'POST' ? 200 : 405);
echo json_encode($response, JSON_UNESCAPED_UNICODE);
?>

Http request response php (http запрос и ответ в php)

{"message":"Данные получены","data":{"key":"value"}}
Важно проверять наличие ключей в массивах, использовать фильтрацию входных данных и экранирование вывода. Типичная ошибка - отсутствие вызова header('Content-Type: ...'), что приводит к неправильной интерпретации ответа браузером.

Как отправить POST запрос с помощью cURL?

$ch = curl_init('https://httpbin.org/post');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, ['param1' => 'value1']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $response;
{ "form": { "param1": "value1" } }
Необходимо устанавливать CURLOPT_RETURNTRANSFER, иначе результат будет выведен сразу. Также нужно обрабатывать ошибки с помощью curl_error() и проверять HTTP-код ответа.

Как обработать входящий JSON запрос?

$raw = file_get_contents('php://input');
$data = json_decode($raw, true);
if (json_last_error() !== JSON_ERROR_NONE) {
    http_response_code(400);
    echo 'Неверный JSON';
    exit;
}
header('Content-Type: application/json');
echo json_encode(['received' => $data]);
{"received":{"key":"value"}}
Требуется проверять ошибки json_decode(). Для больших объёмов данных следует учитывать ограничения php://input и memory_limit.

Как использовать file_get_contents для простых HTTP запросов?

$opts = [
    'http' => [
        'method' => 'GET',
        'header' => "Accept: application/json\r\n"
    ]
];
$context = stream_context_create($opts);
$result = file_get_contents('https://api.example.com/data', false, $context);
if ($result === false) {
    // обработка ошибки
}
echo $result;
(ответ сервера)
Метод не подходит для запросов с телом (POST без контекста). Ошибки возникают при недоступности сервера или неправильных заголовках. Рекомендуется включать проверку на false.

Расширенные примеры работы с HTTP

Пример
// Отправка запроса с авторизацией через Bearer token
$ch = curl_init('https://api.example.com/secure');
$token = 'your_token_here';
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer ' . $token,
    'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$info = curl_getinfo($ch);
if ($info['http_code'] !== 200) {
    // логирование ошибки
}
curl_close($ch);
// Результат: ответ от защищённого API
(ответ сервера)

Загрузка файла через multipart/form-data:

Пример
$ch = curl_init('https://httpbin.org/post');
$cfile = new CURLFile('/path/to/file.jpg', 'image/jpeg', 'upload.jpg');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, ['file' => $cfile]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{ "files": { "file": "..." } }
При использовании CURLFile требуется PHP версии 5.5 и выше. В более старых версиях применяется префикс @ в значении CURLOPT_POSTFIELDS.

Работа с несколькими запросами через curl_multi:

Пример
$urls = ['https://api1.example.com', 'https://api2.example.com'];
$mh = curl_multi_init();
$handles = [];
foreach ($urls as $i => $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($mh, $ch);
    $handles[$i] = $ch;
}
$running = null;
do {
    curl_multi_exec($mh, $running);
} while ($running > 0);
foreach ($handles as $ch) {
    $response = curl_multi_getcontent($ch);
    // обработка ответа
    curl_multi_remove_handle($mh, $ch);
    curl_close($ch);
}
curl_multi_close($mh);
(массив ответов)
Необходимо корректно обрабатывать состояние выполнения и проверять ошибки каждого дескриптора.

HTTP запрос и ответ в PHP - comments

En
Http request response php (php)