В последнее время так или иначе приходится касаться разработки на Битрикс. И сегодня мы с вами рассмотрим как отправить 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> из массива и много чего еще. Вообщем перед тем как кодить что-то свое, всегда нужно ознакомиться с тем что уже есть ))
Комментариев нет :
Отправить комментарий