Отправка POST-запросов через cURL

PHP

Программа cURL – HTTP-клиент, доступный массе веб-серверов и служащий для работы с различными методами взаимодействия с доступным онлайн содержимым. Несмотря на прошедшие 24 года с момента выпуска, софт продолжает обновляться и поддерживаться языками программирования и целыми операционными системами. К первым относится PHP, куда этот модуль встраивается одной командой.

Яркий пример, где может понадобиться cURL–отправка запросов по типу OPTIONS, HEADERS, POST. Для парсинга лучше обратиться к отдельно загружаемому классу phpQueryлибо интегрированному DOM.

Описание модуля

Язык поддерживает расширение начиная с его версии под номером 7.10.5. Менее новые релизы могут вызывать ошибки при выполнении кода либо попросту не давать работать программам. В зависимости от ОС необходимо загружать разные архивы, представленные на официальном сайте. Можно поступить иначе – собрать веб-сервер с cURLпрямо из терминала, введя команду наподобие этой (в зависимости от нужной спецификации PHP):

apt install curl libcurl3 libcurl3-dev php5-curl

Строка актуальна для Linux и выполняется при наличии прав root. Также можно подставить команду sudo в самое начало, если нет возможности использовать возможности суперпользователя. Запуск самого сервера возможен и без рут-доступа. Более того, этот момент рекомендован создателями программ для обеспечения безопасной работы.

Отправка запросов

Преимущества POST перед GET:

  • возможность отправки данных в JSON;
  • отсутствие лимита в 2048 символов (некоторые серверы обрабатывают до 65535, однако такой момент прослеживается на малом числе сайтов);
  • поддержка вложенности информации;
  • совместимость со знаками, отличающимися от латинских, без принудительного перекодирования.

Под JSON подразумевается структурированная система вложения информации, плавно приходящая на замену стандарту XML. Это связано с его компактностью, заметной даже при составлении небольших массивов. Чтобы преобразовать PHP-массивы в этот формат, следует воспользоваться функцией json_encode();.

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

При использовании PHP для отправки POST содержимое запросов не может быть подменено пользователем (значения переменных подставляются там, где это явно указывается), поскольку для этих целей используется серверная обработка. В связи с этим капчам и важным скриптам, взаимодействующим с различнымиAPIпо приватным ключам, не следует давать создавать POST на стороне клиента – например, через JavaScript. Иначе запросы станут доступны посетителям не только для чтения, но и для изменения.

Примеры использования

Перевод массива в JSON

Чтобы подготовить PHP-массив к отправке через POST, следует сперва выполнить его конвертацию в JSON с помощью json_encode();. Функция поддерживает три параметра:

  • $value – массив или сохранённые в другом виде данные, над которыми будут проводиться действия. Единственное обязательное значение;
  • $flags – константы, говорящие скрипту о необходимости выполнения дополнительных действий и рассмотренные в документации;
  • $depth – максимальная глубина вложенности. Полезно вводить, если $valueсоздаётся автоматически и может содержать рекурсивно входящие в сами себя данные. Несмотря на предотвращение таких случаев встроенным интерпретатором, часть информации все равно может записаться, если не установить значение. Должно превышать 0.

<?
$array = array(
«fruit» =>»apple»,
«berry» =>»strawberry»,
«vegetable» =>»pumpkin»
); // Создание массива
$result = json_encode($array, JSON_PRETTY_PRINT); // Превращение массивав JSON с «красивой печатью»
echo $result; //

Результат: { «fruit»: «apple», «berry»: «strawberry», «vegetable»: «pumpkin» }

Есть и обратная функция – json_decode();.Она принимает четыре аргумента: $json, $associative, $depth, $flags. Если первый и два последних не отличаются от рассмотренных выше, то $associative, принимающий значения вида «Булев тип», отвечает за вид выводимой информации. Если true – возвращается ассоциативный массив, если false – объект.

Отправка POST через cURL

<?
$array = array(
«fruit» =>»apple»,
«berry» =>»strawberry»,
«vegetable» =>»pumpkin»
); // Создание массива
$array = json_encode($array, JSON_PRETTY_PRINT); // Конвертация массива $array без создания дополнительной переменной

$ch = curl_init(‘https://example.net’); // Указание сайта обработчика, куда отправляется POST
curl_setopt($ch, CURLOPT_POST, 1); // Указание типа запроса: POST
curl_setopt($ch, CURLOPT_POSTFIELDS, $array); // Указание содержимого запроса: массив $array
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Указание дополнительных параметров
$content = curl_exec($ch); // Указание действия
curl_close($ch); // Завершение скрипта

print $content; // Вывод ответа сервера

Комментарии даны по ходу скрипта.

Отправка POST без cURL

Существует решение без необходимости установки cURL, завязанное на file_get_contents();.Функция, несмотря на своё название, поддерживает не только HTTPGET:

<?
$link = «https://example.net»; // Ссылка на обработчика, куда отправляется POST
$body = array(
«key_1″ =>»value_1»,
«key_2″ =>»value_2»,
«key_3″ =>»value_3»
); // Создание массива «тела»
$body = json_encode($body, JSON_PRETTY_PRINT); // Конвертация массива «тела» в JSON без добавления дополнительной переменной
$length = strlen($body); // Измерение длины массива «тела»
$headers = array(
«http» =>
array(
«method» =>»POST»,
«header» =>»Content-type: application/x-www-form-urlencoded\r\nContent-Length: {$length}»,
«content» => $body
)
); // Создание массива с данными, отправляемыми на сервер
$data = stream_context_create($headers); // Подготовка массива с данными, отправляемыми на сервер, к отправке через POST
$result = file_get_contents($link, false, $data); // Отправка через POST
echo($result); // Вывод содержимого ответа

Оцените статью
Образовательный портал WELCOME4U.RU
Добавить комментарий

Adblock
detector