Gato GraphQL vs WP REST API
Сравнение Gato GraphQL и WP REST API


Различия между REST и GraphQL API в целом справедливы при сравнении WP REST API с Gato GraphQL.
С GraphQL вы можете выполнить специально составленный GraphQL query к endpoint, указав, какие именно данные вам нужны, и получив только их в рамках одного запроса.
Например, следующий GraphQL query получит необходимые данные для конкретной записи, включая данные о её связях (автор, категории и метки), — всё в одном запросе:
query {
post(by: { id: 1 }) {
title
content
url
date
author {
id
name
}
categories {
id
name
}
tags {
id
name
}
}
}Чтобы получить те же данные через REST, вам, вероятно, потребуется сначала выполнить запрос для получения данных записи, а затем отдельный запрос для каждой из её связей (автор, категории и метки).
Эти архитектурные различия между REST и GraphQL были подробно рассмотрены в других источниках, поэтому здесь мы не будем их повторять.
Ниже приведём более конкретное сравнение Gato GraphQL со всеми расширениями и WP REST API.
Сводная таблица
| Характеристика | Gato GraphQL | WP REST API |
|---|---|---|
| Получение данных | Выполняет специально составленные GraphQL queries к endpoint, получая конкретные данные в одном запросе. | Требует нескольких запросов к разным endpoints для получения связанных данных (например, данные записи, автора, категорий и меток). |
| Endpoints | Поддерживает Persisted Queries — endpoints с предопределёнными данными, созданные на языке GraphQL через пользовательский интерфейс в wp-admin, без необходимости развёртывания кода. | Предоставляет данные через REST endpoints, каждый из которых имеет собственный URL и предопределённые данные, создаётся с помощью PHP-кода и развёртывается в теме или плагине. |
| Контроль доступа | Обеспечивает гибкость с контролем доступа на уровне поля на основе правил (например, роли пользователей, capabilities, диапазон IP). | Ограничивает данные на основе параметра context (например, view для неаутентифицированных пользователей, edit для аутентифицированных пользователей с правами). |
| Пакетные операции | Поддерживает выполнение множественных queries, где один GraphQL-документ может выполнять несколько операций, которые могут обмениваться состоянием через директиву @export, превосходя batch requests. | Допускает batch requests, при которых несколько запросов обрабатываются внутри одного HTTP-запроса. |
| Управление сайтом | Позволяет получать данные, изменять их и сохранять обратно в рамках одного GraphQL-документа через пользовательские интерфейсы, обеспечивая автоматизацию и управление сайтами WordPress. Может выполнять задачи множества плагинов: дублирование, автоматизацию, резервное копирование, поиск/замену, webhooks и перевод. Это API и гораздо больше. | В первую очередь API для доступа к данным WordPress и управления ими. |
| Универсальность | Универсальный инструмент для управления сайтами WordPress, способный изменять данные и интегрироваться со сторонними сервисами посредством GraphQL queries. | Ориентирован на предоставление API; для аналогичной функциональности требует дополнительных плагинов или пользовательского кода. |
Краткое изложение ключевых моментов:
- Получение данных: Gato GraphQL использует специализированные queries, тогда как WP REST API использует множество запросов к endpoints.
- Endpoints: Gato GraphQL использует persisted queries, созданные через UI, тогда как WP REST API использует REST endpoints, написанные на PHP.
- Контроль доступа: Gato GraphQL предлагает контроль на уровне поля, тогда как WP REST API использует параметр context.
- Пакетные операции: Gato GraphQL использует Multiple Query Execution, а WP REST API использует batch requests.
- Управление сайтом: Gato GraphQL — комплексный инструмент, а WP REST API — прежде всего API.
Доступ к предопределённым данным
В WP REST API данные предоставляются через REST endpoints. Каждый endpoint имеет собственный URL, а его данные предопределены (для соответствующих ресурсов, таких как записи или пользователи).
По аналогии с REST endpoints, Gato GraphQL поддерживает Persisted Queries — endpoints с предопределёнными данными. Запрос к persisted query через GET выполнит сохранённый GraphQL query и вернёт ожидаемый ответ в формате JSON:

Разница между ними состоит в том, что REST API endpoints создаются с помощью PHP-кода и должны быть развёрнуты в теме или плагине, тогда как persisted queries в Gato GraphQL создаются на языке GraphQL и публикуются через пользовательский интерфейс (на основе редактора WordPress) в wp-admin — без необходимости развёртывания какого-либо кода.

Одни и те же механизмы кэширования могут применяться как к REST endpoints, так и к GraphQL persisted queries. Поскольку persisted query доступна по собственному endpoint, её ответ можно кэшировать с помощью стандартного HTTP-кэширования (PRO).
Контроль доступа
Ограничение данных в WP REST API зависит от параметра context. Передача ?context=view возвращает данные для неаутентифицированных пользователей, а ?context=edit включает дополнительные данные для аутентифицированных пользователей (с соответствующими правами), например поле content.raw записи.
Gato GraphQL предоставляет значительно большую гибкость: каждое отдельное поле может быть доступно или недоступно на основе правил контроля доступа. Вы можете указать, что определённое поле доступно только вошедшим в систему пользователям, пользователям с определённой ролью или capability, либо посетителям из определённого диапазона IP (PRO).

Пакетные операции
WP REST API позволяет выполнять batch requests, при которых несколько запросов обрабатываются внутри одного HTTP-запроса.
Gato GraphQL предоставляет выполнение множественных queries, где один GraphQL-документ может выполнять несколько операций.
Multiple Query Execution является улучшением по сравнению с batch requests, поскольку операции могут обмениваться состоянием друг с другом через директиву @export.
Например, чтобы дублировать запись, операция query получает данные записи и передаёт их операции mutation, которая создаёт новую запись на их основе:
query GetPostAndExportData($postId: ID!)
{
post(by: { id: $postId }, status: any) {
author {
id @export(as: "authorID")
}
categories {
id @export(as: "categoryIDs", type: LIST)
}
rawContent @export(as: "rawContent")
rawExcerpt @export(as: "excerpt")
featuredImage {
id @export(as: "featuredImageID")
}
tags {
id @export(as: "tagIDs", type: LIST)
}
rawTitle @export(as: "title")
}
}
mutation DuplicatePost
@depends(on: "GetPostAndExportData")
{
createPost(input: {
status: draft,
authorBy: {
id: $authorID
},
categoriesBy: {
ids: $categoryIDs
},
contentAs: {
html: $rawContent
},
excerpt: $excerpt
featuredImageBy: {
id: $featuredImageID
},
tagsBy: {
ids: $tagIDs
},
title: $title
}) {
postID
}
}Управление сайтом WordPress
Gato GraphQL позволяет получать данные из базы данных, изменять их по мере необходимости и сохранять обратно — всё в рамках одного GraphQL-документа.
Это достигается через пользовательские интерфейсы: для составления и публикации GraphQL queries, настройки endpoints по мере необходимости и автоматизации выполнения query при наступлении определённого события.
Всё это означает, что Gato GraphQL является универсальным инструментом для управления сайтами WordPress, удовлетворяя те сценарии использования, при которых данные (будь то данные сайта WordPress или предоставленные сторонними сервисами) должны быть изменены, — поскольку это достигается выполнением соответствующего GraphQL query.
Обратите внимание, как Gato GraphQL способен обеспечить функциональность множества плагинов:
- Это не плагин дублирования, однако с его помощью можно дублировать записи.
- Это не плагин автоматизации, но вы можете автоматизировать свои задачи без каких-либо ограничений.
- Это не плагин резервного копирования, но вы можете импортировать и экспортировать записи.
- Это не плагин поиска и замены, но вы можете массово изменять записи.
- Это не плагин webhooks и не HTTP-клиент, но вы можете как отправлять запросы к любому API, так и получать и обрабатывать входящие запросы от любого сервиса.
- Это не плагин перевода, но вы можете переводить любой контент.
WP REST API — это просто API.
Gato GraphQL тоже является API, но и гораздо большим.
