До Битрикса я на нескольких проектах использовал 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 блоки. Далее будет каталог (товары, цены и т.д.). Решение опубликовано на маркетплейсе.
Источник: https://reactivebx.ru/blog/graphql-api-dlya-bitriksa/