多个自定义端点的使用场景
GraphQL 通常只公开一个端点来查询数据。然而,在某些情况下,公开多个自定义端点更为合适,每个端点提供各自定制化的模式。这样,只需切换所访问的端点,就能为不同用户或应用程序提供不同的行为。
在 GraphQL 中公开多个端点并不等同于 REST。在 REST 中,每个端点提供对预定义资源或资源集合的访问;而多个 GraphQL 端点依然各自提供对其模式中所有数据的访问,能够精确获取所需内容。这仍然是正常的 GraphQL 行为,只是增加了从不同模式访问数据的能力。
此功能也不同于模式拼接(schema stitching)或联邦(federation)——后者是将多个数据源合并到单一统一图中。使用多个端点时,我们处理的是多个模式,目的是独立地使用它们,而不是将其作为更大模式的一部分。
公开不同的模式可以提供对多个独立图的访问。GraphQL 创始人 Lee Byron 解释了这种方式何时有用:
A good example of this might be if you've company is centered around a product and has built a graphql API for that product, and then decides to expand into a new business domain with a new product that doesn't relate to the original product. It could be a burden for both of these unrelated products to share a single API and two separate endpoints with different schema may be more appropriate.
[...] Another example is [...] - you may have a separate internal-only endpoint that is a superset of your external GraphQL API. Facebook uses this pattern and has two endpoints, one internal and one external. The internal one includes internal tools which can interact with product types.
让我们来看看公开多个 GraphQL 端点的其他使用场景。
分别公开管理员端点和公开端点
当我们为公司所有数据使用单一图时,可以通过设置访问控制策略来验证谁有权访问 GraphQL 模式中的不同字段。例如,可以将字段配置为仅供已登录用户或具有特定角色的用户访问。
然而,当某些字段包含敏感或机密信息,且这些字段在任何情况下都不应被无关方访问时,我们宁可一开始就不在公开模式中暴露这些字段,而只在仅限团队访问的私有模式中公开。这种策略可以保护我们的私有数据免受意外问题(如软件漏洞和配置疏忽)的影响,并通过仅允许特定 IP 的访问者访问私有端点进一步加强安全性。
因此,我们可以创建两个独立的模式——Admin 模式和 Public 模式,并分别通过 /graphql/admin(限制特定 IP 访问)和 /graphql/public(所有人可访问)端点公开。
以更安全的方式限制对私有信息的访问
本节是对前一节的推广:不仅仅是公开与管理员的区分,而是任何需要确保某组用户绝对无法访问另一组用户信息的场景。
例如,当我们需要为不同客户创建定制化模式时,可以为每个客户公开一个自定义端点(如 /graphql/some-client、/graphql/another-client 等),这比让他们访问同一统一模式并通过访问控制进行验证更为安全。
为不同应用程序提供不同行为
我们可以为访问同一数据源的不同应用程序提供各自不同的行为。
例如,Reddit 在桌面浏览器和移动浏览器中返回不同的响应。从桌面浏览器访问时,无论是否登录,都可以直接查看内容:

而从移动端访问时,则需要登录才能查看内容,并会被引导使用 App:

这种不同的行为可以通过创建 Desktop 模式和 Mobile 模式两个模式,分别在 /graphql/desktop 和 /graphql/mobile 下公开来实现。
以不同语言生成网站
如果我们想以不同语言生成同一网站,可以将语言代码作为自定义端点结构的一部分,例如英语使用 /graphql/en,法语使用 /graphql/fr。这样,GraphQL 服务器可以获取该信息并将数据翻译为目标语言。
最后,在静态网站生成器中指向这些端点,即可生成对应语言的网站:

在发布生产环境前测试升级后的模式
如果我们想升级 GraphQL 模式,并让部分用户提前测试,可以通过 /graphql/upcoming 端点公开新模式。更进一步,还可以公开一个 /graphql/bleeding-edge 端点,持续从开发环境部署最新模式。
支持 BfF 方式
Backend-for-Frontends(简称 BfF)是一种为不同客户端生成不同 API 的方式,让每个客户端「拥有」自己的 API,从而根据自身需求生成最优版本。
在此模型中,自定义 BfF 充当后端服务与客户端之间的中间层:

在 GraphQL 中,可以通过在单一 GraphQL 服务器上实现所有 BfF 并使用多个端点来满足此模型,每个端点负责特定的 BfF/客户端(如 /graphql/mobile 和 /graphql/web):
