Найти в Дзене
ReactiveBx

GraphQL API для Битрикса

https://marketplace.1c-bitrix.ru/solutions/rbx.graphql/
https://marketplace.1c-bitrix.ru/solutions/rbx.graphql/

До Битрикса я на нескольких проектах использовал 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 (ее можно отключить в настройках модуля).

Клиентское приложение для GraphQL Altair (запрос, ответ, документация API)
Клиентское приложение для GraphQL Altair (запрос, ответ, документация API)

API имеет модульную структуру, напоминающую модули Битрикса. Пока я сделал инфоблоки и highload блоки. Далее будет каталог (товары, цены и т.д.). Решение опубликовано на маркетплейсе.

Источник: https://reactivebx.ru/blog/graphql-api-dlya-bitriksa/