Работа с 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)