Persisted Queries
Persisted QueriesPersisted Queries

Persisted Queries

Included in the “Power Extensions” bundle

Используйте GraphQL queries для создания заранее определённых эндпоинтов, как в REST, получая преимущества обоих API.

Описание

С REST вы создаёте несколько эндпоинтов, каждый из которых возвращает заранее определённый набор данных.

ПреимуществаНедостатки
✅ Просто в использовании❌ Создавать все эндпоинты утомительно
✅ Доступ через GET или POST❌ Проект может столкнуться с узкими местами в ожидании готовности эндпоинтов
✅ Можно кешировать на сервере или CDN❌ Создание документации обязательно
✅ Безопасно: раскрываются только предусмотренные данные❌ Может работать медленно (особенно для мобильных приложений), так как приложению может потребоваться несколько запросов для получения всех данных

С GraphQL вы отправляете любой запрос на единственный эндпоинт, который возвращает именно запрошенные данные.

ПреимуществаНедостатки
✅ Нет проблем с лишней или недостаточной выборкой данных❌ Доступ только через POST
✅ Может работать быстро, так как все данные получаются в одном запросе❌ Нельзя кешировать на сервере или CDN, что делает его медленнее и дороже, чем могло бы быть
✅ Позволяет быстро итерировать проект❌ Может потребоваться изобретать велосипед, например, для загрузки файлов или кеширования
✅ Может быть самодокументируемым❌ Необходимо справляться с дополнительными сложностями, например, с проблемой N+1
✅ Предоставляет редактор для queries (GraphiQL), упрощающий задачу 

Persisted queries объединяют эти два подхода:

  • Используют GraphQL для создания и выполнения queries
  • Но вместо того чтобы раскрывать единственный эндпоинт, каждый заранее определённый запрос доступен под собственным эндпоинтом

Таким образом, мы получаем несколько эндпоинтов с предопределёнными данными, как в REST, но созданных с помощью GraphQL, сочетая преимущества обоих подходов и избегая их недостатков:

ПреимуществаНедостатки
✅ Доступ через GET или POST❌ Создавать все эндпоинты утомительно
✅ Можно кешировать на сервере или CDN❌ Проект может столкнуться с узкими местами в ожидании готовности эндпоинтов
✅ Безопасно: раскрываются только предусмотренные данные❌ Создание документации обязательно
✅ Нет проблем с лишней или недостаточной выборкой данных❌ Может работать медленно (особенно для мобильных приложений), так как приложению может потребоваться несколько запросов для получения всех данных
✅ Может работать быстро, так как все данные получаются в одном запросе❌ Доступ только через POST
✅ Позволяет быстро итерировать проект❌ Нельзя кешировать на сервере или CDN, что делает его медленнее и дороже, чем могло бы быть
✅ Может быть самодокументируемым❌ Может потребоваться изобретать велосипед, например, для загрузки файлов или кеширования
✅ Предоставляет редактор для queries (GraphiQL), упрощающий задачу❌ Необходимо справляться с дополнительными сложностями, например, с проблемой N+1 👈🏻 эта проблема решена базовым движком

Редактор persisted query

Выполнение Persisted Query

После публикации persisted query её можно выполнить по её permalink.

Persisted query может быть выполнена непосредственно в браузере, так как доступ к ней осуществляется через GET, и вы получите запрошенные данные в формате JSON:

Выполнение persisted query в браузере

Создание Persisted Query

При нажатии на ссылку Persisted Queries в меню отображается список всех созданных persisted queries:

Persisted queries с описанием
Persisted queries с описанием

Persisted query — это пользовательский тип записи (CPT). Чтобы создать новую persisted query, нажмите кнопку «Добавить новую GraphQL persisted query», откроется редактор WordPress:

Создание новой Persisted Query

Основным элементом является клиент GraphiQL, который по умолчанию поставляется с Explorer. Щелчок по полям на левой боковой панели добавляет их в запрос, а нажатие кнопки «Run» выполняет запрос:

GraphiQL Explorer

Когда запрос готов, опубликуйте его, и его permalink станет эндпоинтом. Ссылка на эндпоинт (и на исходный код) отображается на боковой панели «Обзор эндпоинта Persisted Query»:

Обзор эндпоинта Persisted Query

Добавив ?view=source к permalink, вы увидите persisted query и её конфигурацию (при условии, что пользователь вошёл в систему и роль пользователя имеет доступ к ней):

Исходный код persisted query

По умолчанию эндпоинт persisted query имеет путь /graphql-query/, и это значение можно настроить через Настройки:

Настройки Persisted query
Настройки Persisted query

Конфигурация схемы

Определение того, какие элементы содержит схема и какой доступ к ней будут иметь пользователи, задаётся в конфигурации схемы.

Поэтому необходимо создать конфигурацию схемы, а затем выбрать её из выпадающего списка:

Выбор конфигурации схемы

Организация Persisted Queries по категориям

На боковой панели «Категории эндпоинтов» можно добавлять категории для удобного управления Persisted Query:

Категории эндпоинтов при редактировании Persisted Query

Например, можно создавать категории для управления эндпоинтами по клиенту, приложению или любому другому необходимому признаку:

Список категорий эндпоинтов

В списке Persisted Queries можно видеть их категории, а нажатие на любую ссылку категории или использование фильтра вверху покажет только записи этой категории:

Список Persisted Queries с категориями

Приватные persisted queries

Установив статус Persisted Query как private, доступ к эндпоинту получит только администратор. Это предотвращает непреднамеренный доступ к данным со стороны пользователей, которые не должны его иметь.

Например, можно создавать приватные Persisted Queries для управления приложением, например для получения данных с целью создания отчётов с метриками.

Приватная Persisted Query

Persisted queries, защищённые паролем

Если вы создаёте Persisted Query для конкретного клиента, можно назначить ей пароль, чтобы обеспечить дополнительный уровень безопасности и гарантировать, что только этот клиент получит доступ к эндпоинту.

Persisted Query, защищённая паролем

При первом обращении к persisted query, защищённой паролем, пользователь увидит экран с запросом пароля:

Persisted Query, защищённая паролем: первый доступ

Только после ввода и проверки пароля пользователь получит доступ к нужному эндпоинту.

Динамические persisted queries с помощью параметров URL

Значение каждой переменной можно задать через параметр URL (с именем переменной) при выполнении persisted query. Если включена опция «Переопределяют ли параметры URL переменные?», параметр URL будет иметь приоритет. В противном случае приоритет будет иметь значение, определённое в словаре переменных (если оно задано).

Например, в этом запросе количество результатов контролируется переменной $limit со значением по умолчанию 3:

Использование переменных в persisted query

При выполнении этой persisted query передача ?limit=5 выполнит запрос, возвращающий 5 результатов:

Переопределение значения переменных в persisted query