GraphQL API для Битрикса
Артем Житник
До Битрикса я на нескольких проектах использовал GraphQL. По сравнению с REST обладает большей гибкостью. Вопрос что лучше может вызвать религиозные войны, поэтому опишу свой опыт с практическими примерами.
Наверное каждый второй разработчик на Битриксе, а может просто каждый, писал скрипты для ajax запросов, на коленке, чтоб работало здесь и сейчас. В больших системах эти скрипты превращаются в снежный ком. Сопровождать такие системы очень сложно. Кто-то использовал встроенный механизм ajax контроллеров Битрикса. Отдельные гении осилили встроенный REST API. На данный момент мне кажется он больше подходит для внутренних нужд, для обмена между своими приложениями.
Я решил написать модуль реализующий GraphQL API на базе graphql-php. Отличная библиотека! На данный момент мой модуль умеет:
- Публиковать инфоблоки;
- Выбирать элементы инфоблоков с кастомными фильтрами и сортировками;
- Запрашивать свойства элементов инфоблоков, включая множественные;
- Выбирать разделы инфоблоков;
- Запрашивать пользовательские свойства разделов;
- Выбирать данные highload блоков;
- Запрашивать данные о пользователе;
- Отдельным образом показывать разные типы: файлы, списки, привязки к инфоблокам, справочники, видео и т.д.
- Учитывать права пользователя на доступ к элементам, разделам, highload блокам;
- Делать ограниченную публикацию схемы - только тех данных которые требуются приложению.
Указанного выше достаточно для работы контентного сайта, типа моего бложика.
Пример запроса:
{ iblock { blog { getElement(code: "graphql-api-dlya-bitriksa"){ id name activeFrom detailText detailTextType createdBy { name lastName personalPhoto { url } } properties { relatedPosts { url name active activeFrom } } } } } }
Мы запрашиваем данные поста блога с кодом "graphql-api-dlya-bitriksa": несколько полей, включая детальный текст в html формате, и данные о пользователе создавшем элемент инфоблока. Также получаем несколько полей множественного свойства "Связанные публикации". Получаем результат похожей структуры:
{ "data": { "iblock": { "blog": { "getElement": { "id": "35", "name": "GraphQL API для Битрикса", "activeFrom": "2021-09-30T15:10:12+03:00", "detailText": "<p>До Битрикса я на нескольких проектах использовал GraphQL. По сравнению с REST обладает большей гибкостью. Вопрос что лучше может вызвать религиозные войны, поэтому опишу свой опыт с практическими примерами.</p>...", "detailTextType": "html", "createdBy": { "name": "Артем", "lastName": "Житник", "personalPhoto": { "url": "/upload/main/61a/16qybm7bi5r0eqd6wwy703m4zmwbf0tl.jpg" } }, "properties": { "relatedPosts": [ { "url": "/blog/obshchaya-skhema-tipovogo-proekta/", "name": "Общая схема типового проекта", "active": true, "activeFrom": "2021-09-29T12:23:00+03:00" } ] } } } } } }
Разве не круто? Можно выполнять запросы с большей вложенностью, с другими наборами полей и свойств. Попробуйте сами. Точка входа в API: /bitrix/modules/rbx.graphql/lib/graphql.php. Очень удобно пользоваться специальными клиентами, например Altair. Можно смотреть документацию API (ее можно отключить в настройках модуля).
API имеет модульную структуру, напоминающую модули Битрикса. Пока я сделал инфоблоки и highload блоки. Далее будет каталог (товары, цены и т.д.). Планирую опубликовать решение на маркетплейсе.