Разработка SEO оптимизированных высокопроизводительных фронтенд приложений на базе 1С-Битрикс.

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 блоки. Далее будет каталог (товары, цены и т.д.). Планирую опубликовать решение на маркетплейсе.

    GraphQL
    Битрикс
    Altair
    REST

©2022 ReactiveBx работает на «1С-Битрикс: Управление сайтом» и Next.js