Отправка HTTP-запроса в PHP. Как выполнить его с помощью файловых функций?

отправка http-запроса в php. как выполнить его с помощью файловых функций?

Запросы к серверам как операции с файлами

Программистам, работающим на операционной системе Linux, хорошо известен принцип - «всё есть файлы». В основе данной системы заложен своеобразный уровень абстракции, позволяющий взаимодействовать с периферийными устройствами или удаленными серверами как с обычными файлами. Вы просто получаете дескриптор и применяете к нему операции чтения или записи.

PHP следует тому же принципу. Основные файловые функции поддерживают несколько потоковых обработчиков. Например, если функции file_get_contents() будет передана строка «/directory/some-file.txt», она попытается найти файл на локальной машине и достать его содержимое. Однако добавив в начало имени файла элементы URL-адреса, такие как «http://site-name.com» вы заставите файловую функцию применить специфичный потоковый обработчик. PHP самостоятельно откроет соединение с удаленным сервером, отправит ему GET-запрос по HTTP-протоколу, получит и обработает данные, а затем передаст их вам.

//получаем разметку главной страницы Яндекса
echo file_get_contents('https://yandex.ru');


//посылаем http-запрос через дескриптор файла
$descriptor = fopen('https://habrahabr.ru', 'r');
$markup = '';

while (!feof($descriptor)) {
    $markup .= fgets($descriptor);
}

echo $markup;

 

Заметка
Функции file_get_contents() и file_put_contents() просты в использовании, поэтому идеально подходят для отправки HTTP-запросов. В данном уроке рассматривается только такой способ взаимодействия с удаленными серверами. Далее в учебном курсе будут изучены другие инструменты такие как: сокетные соединения, библиотека Curl и т.д.

Настройка контекста GET и POST запросов

Приведенные примеры являются элементарными и выполняют простую отправку GET-запросов. В реальных PHP-скриптах может потребоваться использовать другой тип запроса, передать с ним параметры или специфичные заголовки. Для этого функция file_get_contents() принимает третий необязательный параметр, именуемый контекстом. В file_put_contens() этот параметр четвертый по счету.

Контекст — это специальный набор данных, завернутый в виде ресурса. Получить его можно, передав массив с опциями GET, POST или другого типа запроса функции stream_context_create(). Посмотрите, как это работает в примере.

//отправляем сложный запрос с параметрами
$url = 'https://translate.yandex.ru';

$context = stream_context_create([
    'http' => [
        'method' => 'POST',
        'content' => http_build_query([
            'lang' => 'ru-en',
            'text' => 'Все получилось',
        ])
    ]
]);

echo file_get_contents($url, false, $context);
/*
* В результате вы увидите страницу яндекс
* переводчика с заранее подготовленным текстом
*/

Отметим, что функция stream_context_create() отвечает за создание контекста запросов различных протоколов: ftp, ssl, tcp и т.д. Поэтому весь массив опций лежит в элементе с именем «http», а имена опций строго определены. Особенности запросов по другим протоколам не являются предметом рассмотрения данного урока.

Список основных опций контекста HTTP-запроса:

  • method (строка) — метод запроса: GET, POST, PUT, DELETE и т.д.
  • heeader (массив строк или строка) - дополнительные заголовки отправки запроса.
  • user_agent (строка) — в обычных условиях эта строка идентифицирует тип браузера, пославшего запрос на сервер. Вы можете указать рабочее название своей программы.
  • content (строка) — данные, добавляемые в тело запроса.
  • timeout (число) — количество секунд, через которое PHP разорвет соединение с сервером в случае задержки ответа.

Со всеми опциями различных типов контекстов вы можете ознакомиться на странице официальной документации.

Последние публикации