Пошаговая инструкция, как работать с инфоблоками через rest api Битрикса.
1. Заполнить "Символьный код API" у нужного инфоблока. В данном примере это будет "apiNews". Поставить рядом галочку "Включен доступ через REST" Инструкция с картинками.
2. Создать класс-контроллер путём наследования стандартного контроллера Битрикса для инфоблоков и переопределить в нём два метода.
class NewsIBlockController extends \Bitrix\Iblock\Controller\DefaultElement{
protected function getDefaultPreFilters(): array
{
return [];
}
//метод определяющий какие поля разрешены для запроса через REST
public static function getAllowedList(): array
{
return ['ID', 'IBLOCK_ID', "DETAIL_TEXT", "DETAIL_PICTURE", 'NAME', "PICS_NEWS"];
}
}
Этот класс необходимо подключить в init.php любым удобным способом
3. Зарегистрировать в сервис-локаторе свой контроллер. Можно сделать в отдельном файле, который потом подключить в init.php. Подробнее о сервис-локаторах и способах регистрации тут
Стоит обратить внимание на то, как формируется имя регистрируемого сервиса - "iblock.element.здесьAPIкодИнфоблока.rest.controller".
//Перед использованием класса NewsIBlockController нужно подключить модуль iblock
\Bitrix\Main\Loader::includeModule('iblock');
$serviceName = 'iblock.element.apiNews.rest.controller';
$serviceConfig = [
'constructor' => static function () {
return new \NewsIBlockController();
},
];
$serviceLocator = \Bitrix\Main\DI\ServiceLocator::getInstance();
try {
$serviceLocator->addInstanceLazy($serviceName, $serviceConfig);
if ($serviceLocator->has('iblock.element.apiNews.rest.controller'))
{
//проверка успешной регистрации сервиса
$newsService = $serviceLocator->get('iblock.element.apiNews.rest.controller');
AddMessage2Log(print_r($newsService->getElementEntityAllowedList(), true));
}
}
catch (Exception $e) {
AddMessage2Log($serviceName ." error - " . $e->getMessage());
}
4. Создать вебхук с доступом к модулю iblock и можно делать запросы к REST. Пример запроса к инфоблоку apiNews (его ID = 4), получаем данные по элементу с ID = 8:
Путь до "iblock.Element.get" будет в настройках вебхука.
5. Это пункт актуален, если нужно настроить rest api на БУС, где нет интерфейса для создания вебхуков.Чтобы выйти из данной ситуации, нужно создать в публичной части страницу с компонентом bitrix:rest.hook. В примере ниже компонент размещен по адресу '/rest-hook/index.php'
В некоторых мануалах пишут, что это работает и с обычным прологом, но у меня при подключении "prolog_before.php" вебхук не сохранялся - при нажатии "Сохранить" просто перезагружалась страница. При подключении "prolog_admin.php" всё работает норм. Также плюс в том, что доступ к странице автоматически закрыт от тех, кто не имеет доступа в админку.
Важный момент по ЧПУ: После создания страницы нужно её пересохранить в html режиме, чтобы перезаписались настройки ЧПУ. Именно страницу, а не компонент, так как при сохранении компонента, по неизвестной причине, раздел параметров "SEF_URL_TEMPLATES" превращается в кашу и компонент перестаёт работать. Может это какой-то прикол именно моего сайта) Также можно обновить настройки ЧПУ вручную через админку в разделе "Обработка адресов". В файле urlrewrite.php должно появиться примерно следующее:
После вышеперечисленных манипуляций по адресу /rest-hook/ap/0/ будет доступна форма создания входящего вебхука.
6. Чтобы добавить к штатному REST свои методы, нужно подписаться на событие OnRestServiceBuildDescriptionи в обработчике указать параметры нового маршрута. Подробнее тут
В качестве обработчика используем класс-контроллер NewsIBlockController,уже созданный ранее. Например, добавим возможность создавать элементы инфоблока через REST - для этого создадим в классе NewsIBlockController следующие методы:
//обработчик события `OnRestServiceBuildDescription`.
//В нём регистрируются методы rest api и указываются их обработчики
public static function addCustomRestMethods(): array
{
return [
'iblock' => [
'iblock.Element.add' => [
'callback' => [__CLASS__, 'iBlockElementAdd'],
'options' => [],
],
],
];
}
//упрощённый метод для добавления нового элемента
public static function iBlockElementAdd($query, $nav, CRestServer $server): array
{
try {
if ($query['error'])
{
throw new \Bitrix\Rest\RestException( 'Message', 402, \CRestServer::STATUS_PAYMENT_REQUIRED );
}
if (!isset($query['iblockId']))
{
throw new \Bitrix\Rest\RestException( 'IBLOCK_ID can not be empty', 400, \CRestServer::STATUS_WRONG_REQUEST );
}
if (!isset($query['fields']))
{
throw new \Bitrix\Rest\RestException( 'Iblock fields can not be empty', 400, \CRestServer::STATUS_WRONG_REQUEST );
}
\Bitrix\Main\Loader::includeModule('iblock');
global $USER;
$el = new \CIBlockElement;
$arFields = Array(
"MODIFIED_BY" => $USER->GetID(),
"IBLOCK_SECTION_ID" => false,
"IBLOCK_ID" => (int)$query['iblockId'],
"NAME" => $query['fields']['NAME'],
"CODE" => $query['fields']['CODE'],
"ACTIVE" => "Y",
);
if($elId = $el->Add($arFields))
return ['result' => $elId];
else{
throw new \Bitrix\Rest\RestException( $el->LAST_ERROR );
}
}
catch (Exception $e){
return [
'error' => $e->getCode(),
'error_description' => $e->getMessage()
];
}
}
Теперь можно добавлять новые элементы инфоблоков через запрос вида:
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».