Задача создать свой собственный REST используя контроллеры в Битрикс.
Создам ресурс GET bitrix-domain.local/almat/su/user/, который будет возвращать все ФИО всех пользователей.
Также туда можно будет передать фильтрь params, по которому можно будет отфильтровать пользователей. Для создания своих контроллеров понадобится сначала создать каркас собственного модуля. Как это сделать описано здесь:
Создание собственного модуля в Битрикс
По теории о контроллерах в Битрикс можно почитать тут
https://dev.1c-bitrix.ru/learning/course/index.php?LESSON_ID=6436&COURSE_ID=43
Также, чтобы получить красивые урлы нужно будет поменять настройки роутинга.
1 . Изменить в .htaccess, который лежит в корне
1 2 3 4 5 6 7 |
#RewriteCond %{REQUEST_FILENAME} !/bitrix/urlrewrite.php$ #RewriteRule ^(.*)$ /bitrix/urlrewrite.php [L] RewriteCond %{REQUEST_FILENAME} !/bitrix/routing_index.php$ RewriteRule ^(.*)$ /bitrix/routing_index.php [L] |
2. Изменить в bitrix/.settings.php
1 2 3 4 5 |
'routing' => ['value' => [ 'config' => ['web.php', 'api.php'] ]], |
3. Добавить в папку local файл
/local/routes/api.php
Весь код можно увидеть по ссылке пример контроллера в Битрикс
Скачайте его на свой сервер, обратите внимание на папку controller, где создан сам контроллер. Также обратите внимание на папку include, где происходит добавление нового пространства имен Almat\Su\Controller
Теперь при отправке по адресу
1 2 3 |
curl --location 'http://192.168.1.10/almat/su/user/' , где 192.168.1.10 - это домен Битрикса |
1 2 3 4 |
curl --location 'http://192.168.1.10/almat/su/user/' \ --header 'Authorization: Basic YWRtaW46MTIzNDU2 |
Этот пример можно импортировать в PostmanЛогин и пароль вводите от существуюшего пользователя.
1 2 3 |
{"status":"error","data":null,"errors":[{"message":"Invalid csrf token","code":"invalid_csrf","customData":{"csrf":"9e8b89552254d13c759cd1b0a55920aa"}}]} |
Тут есть два выхода
- Передать csrf в параметре sessid
1 2 3 4 |
curl --location 'http://192.168.1.10/almat/su/user/?sessid=9e8b89552254d13c759cd1b0a55920aa' \ --header 'Authorization: Basic YWRtaW46MTIzNDU2' |
2. Отключить проверку csrf
переопределив метод getDefaultPreFilters, удалив проверку Csrf
1 2 3 4 5 6 7 8 9 10 11 |
public function getDefaultPreFilters(): array { return [ new ActionFilter\Authentication(), new ActionFilter\HttpMethod( [ActionFilter\HttpMethod::METHOD_GET, ActionFilter\HttpMethod::METHOD_POST] ), ]; } |
Теперь при обращении по этому роуту возвращаются данные:
Как фильтровать данные?
Для фильтрации данных нужно передать params c нужным фильтром, например, выбор пользователя с ID = 1 будет выглядеть так
1 2 3 4 |
curl --location --globoff 'http://192.168.1.10/almat/su/user/?params[ID]=1' \ --header 'Authorization: Basic YWRtaW46MTIzNDU2' |
который вернет
1 2 3 4 5 6 7 8 9 |
{ "status": "success", "data": { "1": "Алмат Жандаулетов" }, "errors": [] } |
· Permalink
Отличная статья. спасибо автору.
· Permalink
Удаление проверки CSRF для метода POST не работает также, как для метода GET, поэтому лучше его определить, но передать в параметрах false, так проверка использования csrf работать не будет и ошибки выдавать не будет.
public function getDefaultPreFilters(): array
{
return [
new CustomActionFilter\SimpleToken(),
new ActionFilter\HttpMethod(
[ActionFilter\HttpMethod::METHOD_GET, ActionFilter\HttpMethod::METHOD_POST]
),
new ActionFilter\Csrf(false),
];
}