четверг, 2 октября 2014 г.

Отправка RAW HTTP Post средствами Битрикс API

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

  • Использование класса 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"; }

Где в $xml содержатся наши данные, которые отправляются receiver'у. Обратите внимание на параметры Query. Конкретнее на post_content_type, он у нас "application/octet-stream". В противном случае POST был ушел с application/x-www-form-urlencoded - а это уже совсем другая история.

Ну и второй вариант реализации с помощью 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(); }

И в том, и в другом варианте в $arResult["TEST"] мы получим <result>Ok</result>. Собственно как и было задумано. Надеюсь, что эта заметка оказалась хоть кому-то полезной ;)

p.s. Напоследок ... можно долго изобретать велосипеды в своих компонентах и тысячи раз писать кривые реализации одних и тех же действий. Но зачем? В API Битрикса много чего реализовано (и много чего, кстати, остается за кадром для начинающих разработчиков, т.к. все обычно смотрят документацию на оф. сайте, и редко кто заглядывает в исходники CMS и смотрим как реализованы те или иные модули, а там, между прочим, есть чему поучиться). В том же  /bitrix/modules/main/tools.php есть, к примеру, функция check_email для проверки валидности адреса электронной почты, функция формирования списка выбора <select>...</select> из массива и много чего еще. Вообщем перед тем как кодить что-то свое, всегда нужно ознакомиться с тем что уже есть )) 

Комментариев нет :

Отправить комментарий