Gato GraphQL vs WP REST API
Gato GraphQL 与 WP REST API 的比较


REST API 与 GraphQL API 之间的差异,在比较 WP REST API 与 Gato GraphQL 时同样普遍适用。
使用 GraphQL,您可以针对端点执行定制化的 GraphQL query,指定所需的特定数据,并在单次请求中仅获取该数据。
例如,以下 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 query,在单次请求中获取特定数据。 | 需要向不同端点发送多个请求才能获取关联数据(例如:文章数据、作者数据、分类和标签)。 |
| 端点 | 支持 Persisted Queries,即通过 wp-admin 内的用户界面使用 GraphQL 语言创建的、带有预定义数据的端点,无需部署代码。 | 通过 REST 端点公开数据,每个端点都有其自己的 URL 和预定义数据,通过 PHP 代码创建并部署在主题或插件中。 |
| 访问控制 | 基于规则(例如:用户角色、权限、IP 范围)提供字段级别访问控制的灵活性。 | 根据 context 参数限制数据(例如:未认证用户使用 view,有权限的认证用户使用 edit)。 |
| 批量操作 | 支持 Multiple Query Execution,单个 GraphQL 文档可执行多个操作,并通过 @export 指令在操作间共享状态,是对批量请求的改进。 | 支持批量请求,在单个 HTTP 请求内部处理多个请求。 |
| 站点管理 | 可在单个 GraphQL 文档中获取数据、修改数据并将其存回,通过用户界面实现 WordPress 站点的自动化与管理。可执行多个插件的任务,如复制、自动化、备份、搜索/替换、Webhook 和翻译。既是 API,又远不止于此。 | 主要是用于访问和操作 WordPress 数据的 API。 |
| 通用性 | 一款管理 WordPress 站点的通用工具,能够通过 GraphQL query 进行数据变更并与第三方服务集成。 | 专注于提供 API;要实现类似功能需要额外的插件或自定义代码。 |
核心要点总结:
- 数据获取:Gato GraphQL 使用定制化 query,WP REST API 使用多个端点请求。
- 端点:Gato GraphQL 使用通过 UI 创建的 Persisted Queries,WP REST API 使用 PHP 编码的 REST 端点。
- 访问控制:Gato GraphQL 提供字段级别的控制,WP REST API 使用 context 参数。
- 批量操作:Gato GraphQL 使用 Multiple Query Execution,WP REST API 使用批量请求。
- 站点管理:Gato GraphQL 是综合性工具,WP REST API 主要是 API。
访问预定义数据
使用 WP REST API,您通过 REST 端点公开数据。每个端点都有其自己的 URL,其数据是预定义的(对应相应的资源,例如文章或用户)。
与 REST 端点类似,Gato GraphQL 支持 Persisted Queries,这些也是带有预定义数据的端点。通过 GET 请求 Persisted Query 时,会执行存储的 GraphQL query,并生成预期的 JSON 响应:

两者的区别在于:REST API 端点通过 PHP 代码创建,必须部署在主题或插件中;而 Gato GraphQL 的 Persisted Queries 使用 GraphQL 语言创建,通过 wp-admin 内的用户界面(由 WordPress 编辑器驱动)发布,无需部署任何代码。

相同的缓存机制可应用于 REST 端点和 GraphQL Persisted Queries。由于 Persisted Query 通过其自己的端点访问,其响应可以使用标准的 HTTP 缓存进行缓存(PRO)。
访问控制
WP REST API 中的数据限制取决于 context 参数。传递 ?context=view 返回未认证用户的数据,而 ?context=edit 则为(具有相应权限的)认证用户提供额外数据,例如文章的 content.raw 字段。
Gato GraphQL 提供了更大的灵活性,每个字段都可以根据访问控制规则来设置是否可访问。您可以验证只有已登录用户、或具有特定角色或权限的用户、或来自特定 IP 范围的访客才能访问特定字段(PRO)。

批量操作
WP REST API 允许执行批量请求,在单个 HTTP 请求内部处理多个请求。
Gato GraphQL 提供 Multiple Query Execution,单个 GraphQL 文档可执行多个操作。
Multiple Query Execution 是对批量请求的改进,各操作可通过 @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 query、按需配置端点,以及在某个事件发生时自动执行 query。
这一切都意味着 Gato GraphQL 是管理 WordPress 站点的通用工具,能够满足需要对数据(无论来自 WordPress 站点还是第三方服务)进行变更的使用场景,这些都可以通过执行 GraphQL query 来实现。
请注意 Gato GraphQL 如何提供多个插件的功能:
- 它不是复制插件,但您可以用它复制文章。
- 它不是自动化插件,但您可以自动化您的任务,不受任何限制。
- 它不是备份插件,但您可以导入和导出文章。
- 它不是搜索替换插件,但您可以批量修改文章。
- 它不是 Webhook 插件或 HTTP 客户端,但您既可以向任意 API 发送请求,也可以接收并处理来自任意服务的传入请求。
- 它不是翻译插件,但您可以翻译任意内容。
WP REST API 就是一个 API。
Gato GraphQL 也是一个 API,但远不止于此。
