Как правильно разрабатывать собственные REST-методы для Битрикс24 (в коробке)


На одном из наших недавних внедрений Битрикс24 использовался как бекенд для другой внешней системы — для личного кабинета студента. Через личный кабинет абитуриенты и студенты могут подать заявку на обучение по выбранному курсу, загрузить необходимые для оформления документы, следить за статусом своей заявки, оплачивать счета за обучение, а так же взаимодействовать со своими кураторами. Все это очень плотно интегрированно с бизнес-процессами Битрикс24. Для такой плотной интеграции Битрикс со сторонней системой нам не хватало стандартных REST-методов — логика использования запросов становилась слишком сложной и запутанной.

До нашего прихода на проект много логики уже было реализовано на стороне кабинета студента, что делало его слишком сильно связанным с Битрикс24 и нарушало принципы SOLID-разработки.

Выходом оказалось написание собственных REST-методов. Конечно, кому-то может показаться, что можно было бы просто создать публичную страницу которая будет отдавать на внешний запрос результат в виде JSON объекта, но такой подход является неправильным по нескольким причинам:

1. Это может быть не безопасно. 

2. Это не удобно, так как во внешней системе в ходе интеграции придется по-разному писать запросы к стандартным REST-методам и к таким страницам.  

К счастью, разработчики Битрикс24 предусмотрели возможность писать собственные REST-методы для расширения стандартных. Это очень просто. Пишем собственный класс-провайдер для своих методов:

class CustomRestProvider
{
public static function OnRestServiceBuildDescription()
  {
    return array(
      'custom' => array(
        'custom.hello.world' => array('callback' => 
           array(__CLASS__, 'HelloWorld'),'options' => 
             array()),
	   )
	);
   }
public static function HelloWorld($query, $n, \CRestServer $server){
  $result = array();
  $result['HELLO']='WORLD';	
  return $result;
  }
}

И регистрируем его в php_interface, повесив обработчик на событие:

$eventManager->addEventHandler("rest","OnRestServiceBuildDescription",array('CustomRestProvider', 'OnRestServiceBuildDescription'));

Все готово. 

Класс CustomRestProvider содержит метод OnRestServiceBuildDescription вызывающийся на одноименном событии. Данный метод возвращает массив, ключами которого являются ваши новые scope а значения — массив методов этого scope. Работать со scope можно также как и со стандартными. 

Теперь можно обратиться к методу custom.hello.world также как и к стандартным REST-методам. Не забудьте дать права на новые scope вашим вебхукам:

, ,