Persisted Queries
Persisted QueriesPersisted Queries

Persisted Queries

Included in the “Power Extensions” bundle

使用 GraphQL Query 创建类似 REST 的预定义端点,同时获得两种 API 的优势。

描述

使用 REST,您可以创建多个端点,每个端点返回预定义的数据集。

优势劣势
✅ 简单易用❌ 创建所有端点十分繁琐
✅ 可通过 GETPOST 访问❌ 项目可能因等待端点就绪而遭遇瓶颈
✅ 可在服务器或 CDN 上缓存❌ 必须生成文档
✅ 安全:仅公开预期数据❌ 速度可能较慢(主要针对移动应用),因为应用可能需要多次请求才能获取所有数据

使用 GraphQL,您可以向单一端点发送任意 Query,该端点仅返回所请求的数据。

优势劣势
✅ 无数据不足/过量获取问题❌ 仅可通过 POST 访问
✅ 所有数据在单次请求中获取,速度快❌ 无法在服务器或 CDN 上缓存,导致速度更慢、成本更高
✅ 支持项目快速迭代❌ 可能需要重新发明轮子,例如文件上传或缓存
✅ 可自我文档化❌ 必须处理额外的复杂性,例如 N+1 问题
✅ 提供 Query 编辑器(GraphiQL),简化操作 

Persisted queries 将这两种方式结合在一起:

  • 使用 GraphQL 创建和解析 Query
  • 但不是公开单一端点,而是将每个预定义 Query 以各自独立的端点形式公开

因此,我们获得了与 REST 类似的、具有预定义数据的多个端点,但这些端点使用 GraphQL 创建,从而兼得两者优势、规避各自劣势:

优势劣势
✅ 可通过 GETPOST 访问❌ 创建所有端点十分繁琐
✅ 可在服务器或 CDN 上缓存❌ 项目可能因等待端点就绪而遭遇瓶颈
✅ 安全:仅公开预期数据❌ 必须生成文档
✅ 无数据不足/过量获取问题❌ 速度可能较慢(主要针对移动应用),因为应用可能需要多次请求才能获取所有数据
✅ 所有数据在单次请求中获取,速度快❌ 仅可通过 POST 访问
✅ 支持项目快速迭代❌ 无法在服务器或 CDN 上缓存,导致速度更慢、成本更高
✅ 可自我文档化❌ 可能需要重新发明轮子,例如文件上传或缓存
✅ 提供 Query 编辑器(GraphiQL),简化操作❌ 必须处理额外的复杂性,例如 N+1 问题 👈🏻 此问题已由底层引擎解决

Persisted query 编辑器

执行 Persisted Query

Persisted query 发布后,可通过其永久链接执行。

由于 persisted query 通过 GET 访问,可以直接在浏览器中执行,并以 JSON 格式获取所请求的数据:

在浏览器中执行 persisted query

创建 Persisted Query

点击菜单中的 Persisted Queries 链接,将显示所有已创建的 persisted query 列表:

带描述的 Persisted queries
带描述的 Persisted queries

Persisted query 是一种自定义文章类型(CPT)。要创建新的 persisted query,请点击「新增 GraphQL persisted query」按钮,这将打开 WordPress 编辑器:

创建新的 Persisted Query

主要输入区域是 GraphiQL 客户端,默认附带 Explorer。点击左侧面板中的字段可将其添加到 Query 中,点击「Run」按钮可执行 Query:

GraphiQL Explorer

Query 准备好后,发布它,其永久链接即成为端点。端点(及来源)的链接显示在「Persisted Query Endpoint Overview」侧边栏面板中:

Persisted Query Endpoint Overview

在永久链接后附加 ?view=source,将显示 persisted query 及其配置(前提是用户已登录且用户角色具有访问权限):

Persisted query 来源

默认情况下,persisted query 端点的路径为 /graphql-query/,该值可通过 Settings 进行配置:

Persisted query 设置
Persisted query 设置

Schema 配置

Schema 包含哪些元素以及用户对其具有哪些访问权限,均在 schema 配置中定义。

因此,我们需要创建一个 schema 配置,然后从下拉菜单中选择它:

选择 schema 配置

按分类整理 Persisted Queries

在侧边栏面板「Endpoint categories」中,可以添加分类以帮助管理 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:首次访问

密码输入并验证通过后,用户才能访问预期的端点。

通过 URL 参数使 persisted query 动态化

执行 persisted query 时,可以通过 URL 参数(使用变量名)为每个变量设置值。如果启用了「URL 参数是否覆盖变量?」选项,则 URL 参数优先。否则,变量字典中定义的值优先(如果存在)。

例如,在此 Query 中,结果数量通过变量 $limit 控制,默认值为 3:

在 persisted query 中使用变量

执行此 persisted query 时,传入 ?limit=5 将执行返回 5 条结果的 Query:

覆盖 persisted query 中的变量值