В последнее время так или иначе приходится касаться разработки на Битрикс. И сегодня мы с вами рассмотрим как отправить RAW HTTP Post средствами Битрикс. Для начала давайте разберемся, что же такое HTTP RAW Post? Чтобы не вдаваться в подробности, просто скажу, что это то что можно получить с помощью $HTTP_RAW_POST_DATA или php://input. Предположим у нас есть такой вот скрипт receiver на стороне сервера, который сохраняет http raw post в текстовый файл (пример, естественно, просто учебеный). Назовем его receiver.php:
<?php
$data = $HTTP_RAW_POST_DATA;
//$data = file_get_contents("php://input");
file_put_contents("receiver.log",$data,FILE_APPEND);
echo "<result>Ok</result>\r\n";
?>
Для чего такая штука может использоваться? Ну к примеру на вход этому скрипту подаются некие XML данные, он их обрабатывает и отвечает тоже XML (повторюсь, пример учебный, не надо говорить про схемы, отсутствие версии XML и т.д. и т.п.). Итак, есть такой receiver и нужно послать к нему запрос из Битрикса. Сделать это можно двумя способами:
Где в $xml содержатся наши данные, которые отправляются receiver'у. Обратите внимание на параметры Query. Конкретнее на post_content_type, он у нас "application/octet-stream". В противном случае POST был ушел с application/x-www-form-urlencoded - а это уже совсем другая история.
Ну и второй вариант реализации с помощью HttpClient, тут все куда проще на первый взгляд, но без "курения" исходников до этого решения можно доходить достаточно долго:
И в том, и в другом варианте в $arResult["TEST"] мы получим <result>Ok</result>. Собственно как и было задумано. Надеюсь, что эта заметка оказалась хоть кому-то полезной ;)
p.s. Напоследок ... можно долго изобретать велосипеды в своих компонентах и тысячи раз писать кривые реализации одних и тех же действий. Но зачем? В API Битрикса много чего реализовано (и много чего, кстати, остается за кадром для начинающих разработчиков, т.к. все обычно смотрят документацию на оф. сайте, и редко кто заглядывает в исходники CMS и смотрим как реализованы те или иные модули, а там, между прочим, есть чему поучиться). В том же /bitrix/modules/main/tools.php есть, к примеру, функция check_email для проверки валидности адреса электронной почты, функция формирования списка выбора <select>...</select> из массива и много чего еще. Вообщем перед тем как кодить что-то свое, всегда нужно ознакомиться с тем что уже есть ))
- Использование класса CHTTP (см. /bitrix/modules/main/tools.php), но как следует из комментариев в этом модуле - он deprecated.
- Поэтому вторым вариантом является использование Bitrix\Main\Web\HttpClient, про HttpClient можно "покурить" тут.
Перейдем от слов к делу, с помощью CHTTP можно сделать так:
$post_url = "http://localhost/receiver.php";
$http = new CHTTP();
$arUrl = $http->ParseURL($post_url, $arUrl);
if ($http->Query('POST', $arUrl['host'], $arUrl['port'], $arUrl['path_query'], $xml, '', "application/octet-stream", false))
{ $arResult["TEST"] = $http->result; }
else { $arResult["TEST"] = "BAD"; }
Ну и второй вариант реализации с помощью HttpClient, тут все куда проще на первый взгляд, но без "курения" исходников до этого решения можно доходить достаточно долго:
$post_url = "http://test.local/receiver.php";
$http = new \Bitrix\Main\Web\HttpClient(); // http://bxapi.ru/?module_id=main&class=HttpClient
$http->setHeader("Content-Type","application/octet-stream");
if ($http->post($post_url,$xml))
{ $arResult["TEST"] = $http->getResult(); }
p.s. Напоследок ... можно долго изобретать велосипеды в своих компонентах и тысячи раз писать кривые реализации одних и тех же действий. Но зачем? В API Битрикса много чего реализовано (и много чего, кстати, остается за кадром для начинающих разработчиков, т.к. все обычно смотрят документацию на оф. сайте, и редко кто заглядывает в исходники CMS и смотрим как реализованы те или иные модули, а там, между прочим, есть чему поучиться). В том же /bitrix/modules/main/tools.php есть, к примеру, функция check_email для проверки валидности адреса электронной почты, функция формирования списка выбора <select>...</select> из массива и много чего еще. Вообщем перед тем как кодить что-то свое, всегда нужно ознакомиться с тем что уже есть ))
comment 0 التعليقات:
more_vertsentiment_satisfied Emoticon