Создание API
Создание APIДобавление HTTP-кэширования

Добавление HTTP-кэширования

Когда queries выполняются к серверу GraphQL с использованием GET (вместо более традиционного метода POST), ответ GraphQL может кэшироваться на стороне клиента или на промежуточных этапах между клиентом и сервером (например, через CDN) с помощью стандартного HTTP-кэширования.

Это работает естественным образом для персистентных queries, а для единственного эндпоинта и пользовательских эндпоинтов может работать путём добавления параметра ?query={ GraphQL query } к эндпоинту.

Конфигурация создаётся через список управления кэшем и передаётся эндпоинту через конфигурацию схемы.

Выполнение эндпоинта через GET

Персистентные queries уже подходят для выполнения через GET, поскольку они хранят GraphQL query на сервере (то есть её не нужно передавать в теле запроса).

Однако для единственного эндпоинта и пользовательских эндпоинтов query должна быть передана через параметр ?query=..., добавленный к URL эндпоинта.

Например, следующая GraphQL query:

{
  posts {
    id
    title
    url
    author {
      id
      name
      url
    }
  }
}

...может быть выполнена через GET к единственному эндпоинту следующим образом:

https://mysite.com/graphql/?query={ posts { id title url author { id name url } } }

Автоматический расчёт max-age

Значение max-age ответа вычисляется автоматически на основе списков управления доступом, назначенных эндпоинту (через конфигурацию схемы).

Это значение является наименьшим значением max-age из всех полей и директив в запрошенной query, или no-store, если:

  • выполняется какая-либо мутация
  • какое-либо поле или директива имеет max-age со значением 0
  • правило управления доступом должно проверять состояние пользователя для какого-либо поля или директивы (в этом случае ответ специфичен для пользователя и не может кэшироваться)

Max-age по умолчанию

Поля, для которых не задано конкретное значение max-age, будут использовать значение по умолчанию, определённое в конфигурации схемы:

Значение max-age по умолчанию в конфигурации схемы

Если значение не задано, будет использоваться значение max-age по умолчанию, определённое на странице настроек во вкладке «Cache Control». Это значение составляет 86400 секунд и может быть изменено в настройках.

Пример

Предположим, что у нас задана следующая конфигурация значений max-age для полей типа User:

  • name => 600
  • url => 30

Тогда ответ на эту query будет иметь значение max-age, равное 86400 (потому что ни displayName, ни email не настроены, поэтому используется значение по умолчанию):

query {
  users {
    displayName
    email
  }
}

Ответ на эту query будет иметь значение max-age, равное 30 (соответствующее url — наименьшему значению из всех настроенных полей):

query {
  user(by: {id: 1}) {
    name
    url
  }
}

Ответ на эту query будет иметь значение max-age, равное no-store (потому что поле me требует состояния пользователя):

query {
  me {
    name
    url
  }
}

Ответ на эту query будет иметь значение max-age, равное no-store (потому что выполняется мутация):

mutation {
  createPost {
    id
  }
}

Просмотр всех списков управления кэшем

При нажатии на «Cache Control Lists» в меню плагина отображается список всех созданных списков управления кэшем:

Списки управления кэшем в панели администратора
Списки управления кэшем в панели администратора

Создание нового списка управления кэшем

Нажмите на кнопку «Add New Cache Control List», чтобы открыть редактор WordPress:

Создание списка управления кэшем

Дайте списку управления кэшем название, добавьте записи с полями и директивами и настройте для них значение max-age:

Создание списка управления кэшем

Когда всё готово, нажмите кнопку Publish. После этого новый список управления кэшем становится доступным для конфигурации схемы.

Записи Cache Control

Каждый список управления кэшем содержит одну или несколько записей, каждая из которых включает следующие элементы:

  • Поля, для которых настраивается кэширование
  • Директивы, для которых настраивается кэширование
  • Значение max-age для них

Запись управления доступом

Выбор полей из интерфейсов

Помимо полей из типов, можно также выбирать поля из интерфейсов. В этом случае значение max-age применяется при запросе этих полей из любого типа, реализующего данный интерфейс.

Выбор поля из интерфейса
Выбор поля из интерфейса

Описание списка управления кэшем

Используйте поле «Excerpt» в панели настроек документа, чтобы добавить описание к списку управления кэшем.

Дополнительную информацию можно найти в руководстве Добавление описания к API.

Использование списка управления кэшем

После создания списка управления кэшем его можно применить к пользовательскому эндпоинту или персистентной query, отредактировав соответствующую конфигурацию схемы и выбрав ACL из списка в блоке «Cache Control Lists».

Выбор списка управления кэшем в конфигурации схемы

Если конфигурация не настроена, будут использоваться списки управления кэшем по умолчанию, определённые на странице настроек во вкладке «Cache Control»:

Выбор списков управления кэшем по умолчанию на странице настроек