GraphQL 标识GraphQL

常见问题解答 (FAQ)

入门

为什么我应该使用 GraphQL?#

这取决于你的用例,但总的来说,GraphQL 有一些突出的关键特性。例如,GraphQL 使你能够

我们的主页 概述了更多使用 GraphQL 的理由。

你可以在不重写整个应用程序的情况下尝试 GraphQL。例如,从一个包装现有 REST 调用的单个 HTTP 请求开始。你的 GraphQL 模式业务领域模型 可以逐步扩展。我们建议首先专注于一个用例,只构建该用例所需的模式部分。

GraphQL 是否取代了 REST?#

不,不一定。它们都处理 API,并且从业务角度来看,可以 服务于类似的目的。GraphQL 通常被认为是 REST 的替代方案,但它不是最终的替代品。

GraphQL 和 REST 实际上可以在你的技术栈中共存。例如,你可以将 REST API 抽象到一个 GraphQL 服务器 后面。这可以通过使用 根解析器 将你的 REST 端点掩盖成 GraphQL 端点来实现。

想要了解 GraphQL 与 REST 的对比,可以查看 How To GraphQL 网站。

GraphQL 是否像 SQL 一样是数据库语言?#

不是,但这是一个常见的误解。

GraphQL 是一个规范,通常用于远程客户端-服务器通信。与 SQL 不同,GraphQL 对用于检索数据和持久化更改的数据源无关。访问和操作数据是通过称为 解析器 的任意函数执行的。GraphQL 协调和聚合来自这些解析器函数的数据,然后将结果返回给客户端。通常,这些解析器函数应该委托给一个 业务逻辑层,该层负责与各种底层数据源进行通信。这些数据源可以是远程 API、数据库、本地缓存,以及你的编程语言可以访问的几乎任何其他东西。

有关如何让 GraphQL 与你的数据库交互的更多信息,请查看我们关于 解析器文档

如何学习 GraphQL?#

有很多资源可以帮助你学习 GraphQL,包括本网站。在 我们的文档 中,你会发现一系列文章,解释了基本的 GraphQL 概念及其工作原理。我们的 社区页面 充满了可以参考的资源和可以加入的群组。

有关更实用的指南,请访问 How to GraphQL 全栈教程网站。我们还提供了一个免费的 edX 在线课程,探索 GraphQL:API 查询语言

在你开始学习之旅之前,请确保你了解 什么是 API 以及客户端和服务器之间通常如何进行通信。

GraphQL 是否只适用于 React 或 JavaScript 开发人员?#

不,完全不是。 GraphQL 是一个规范,可以 用任何语言实现。我们的 代码页面 包含许多不同编程语言的库列表,可以帮助您实现它。

不过,您可能会这么想是可以理解的。GraphQL 在 React 大会 上首次亮相,而 GraphQL.js 是迄今为止使用最广泛的实现之一。我们知道这可能会令人困惑,因此我们正在努力改进我们的文档并添加更多非 JavaScript 编写的代码示例。

一般

GraphQL 是前端还是后端?#

两者都是。GraphQL 指定了如何 在客户端和服务器之间交换信息。这包括服务器如何指示 哪些数据和操作可用,客户端应该如何 格式化请求,服务器应该如何 执行这些查询 以及客户端将 接收什么响应

GraphQL 使用 HTTP 吗?#

是的,GraphQL 通常通过 HTTP 提供服务。这主要是因为 HTTP 协议在我们行业中非常普遍。但它有助于您通过创建 单个 HTTP 请求 来尝试 GraphQL。在我们的 通过 HTTP 提供服务 文档中提供了有关设置 GraphQL 服务器以通过 HTTP 操作的指南。

虽然 HTTP 是客户端-服务器协议最常见的选择,但它不是唯一的选择。GraphQL 对传输层是不可知的。因此,例如,您可以使用 WebSockets 来代替 HTTP 进行 GraphQL 订阅,以使用实时数据。

GraphQL 如何影响我的产品的性能?#

在典型的 GraphQL 后端,每个类型上的每个字段都有一个专注的、单一用途的函数来解析该值。此外,GraphQL 不会尝试在客户端处理数据批处理,而是 将该逻辑移到服务器。因此,它具有一些固有的性能优势。最小化过度获取并 减少到服务器的往返次数 是其中两个优势。

在构建 GraphQL 实现时,应考虑其他性能因素。例如,GraphQL 服务可能会很“健谈”,并反复从您的数据库加载数据。这通常通过 实现批处理技术使用 DataLoader 等工具 来解决。

什么是 GraphQL 客户端,为什么要使用它?#

GraphQL 客户端可以帮助您处理查询、变异订阅GraphQL 服务器。它们利用 GraphQL API 的底层结构来自动执行某些流程。这包括批处理、UI 更新、构建时模式验证等等。

我们的代码页面上列出了各种语言的 GraphQL 客户端。在 How To GraphQL 上也有一篇深入解释其优势的文章

不过,您不需要特定的客户端来使用 GraphQL。您可以先尝试使用常规 HTTP 客户端发出 GraphQL 结果。然后,随着应用程序复杂性的增加,您可以切换到 GraphQL 优化的客户端。

GraphQL 是否取代了 ORM?#

不,GraphQL 是一个规范,通常用于远程客户端-服务器通信。它与使用的数据库无关,并且不实现对象关系映射技术。但是,有一些专门为 GraphQL 构建的 ORM。我们的代码页面服务部分列出了其中的一些。

GraphQL 是 Facebook 的吗?#

不,GraphQL 由GraphQL 基金会管理。

也就是说,该规范最初是在 Facebook 开发的,Facebook 是 GraphQL 基金会的成员。您可能会注意到,我们的一些GitHub 存储库的许可证仍然列在 Facebook Inc. 下。我们正在更新这些许可证,并且已经将主要项目(如GraphiQLDataLoader)转换为新的版权:“Copyright (c) 2020 GraphQL Contributors”。

谁在背后支持 GraphQL?#

很多人!GraphQL 规范和所有相关项目都是开源的,所以任何人都可以贡献。也就是说,在代码库背后存在一个结构。它的存在是为了解决社区内部的冲突并指导技术决策。

GraphQL 基金会为 GraphQL 提供了大部分的监督。它由来自数十家不同公司的代表组成。

每月还会有虚拟的GraphQL 工作组 (WG)会议,由 GraphQL 基金会管理。这些会议旨在将常用 GraphQL 库和工具的维护者以及 GraphQL 社区的重大贡献者聚集在一起。WG 会议完全公开。任何人都可以加入并提出议程项目

2020 年 11 月的 WG 会议上,宣布 GraphQL 将在未来拥有一个技术指导委员会 (TSC)。更多信息即将发布。

如果这让你感到困惑,别担心 - 这里有很多事情正在发生。要获得更直观的、高层次的概述,请查看GraphQL 全景图

什么是 GraphQL 基金会?#

GraphQL 基金会是一个中立的基金会,为 GraphQL 提供治理。这包括对开源代码库、资金、活动等的供应商中立监督。它托管在Linux 基金会下,由来自数十家不同公司的代表组成。其理念是,它是一个公正、开放的 GraphQL 社区之家。

您可以访问foundation.graphql.org了解更多信息。

最佳实践

GraphQL 可扩展吗?#

是的,GraphQL 被设计为可扩展的,并且被许多公司在生产环境中使用,承受着非常高的负载。

GraphQL 带有一些内置的性能提升,可以提供帮助。但是,一旦您将其推送到生产环境,您就需要负责跨实例进行扩展并监控性能。

GraphQL 支持离线使用吗?#

不支持,至少不是原生支持。但有一些 GraphQL 客户端 可以帮助你构建离线优先的应用。它们使用了一些功能来执行离线数据操作,例如缓存和服务工作者。

你可以在我们的 代码页面 上找到各种语言的 GraphQL 客户端列表。

GraphQL 的安全问题有哪些?#

与 GraphQL 相关的安全问题大多是任何 API 或服务都会遇到的常见问题。例如:SQL 注入、拒绝服务 (DoS) 攻击,或有人利用有缺陷的身份验证。但也有一些针对 GraphQL 的特定攻击。例如,批量攻击。这些攻击可能是由于 GraphQL 允许你在单个网络调用中批量执行多个查询(或对多个对象实例的请求)造成的。

无论是什么问题,主动防范都很重要。有很多方法可以保护你的 GraphQL 服务器。使用超时、设置查询的最大深度、以及根据服务器完成查询所需的时间来限制查询,都是潜在的方法。

有关常见安全问题及其解决方法的概述,请查看 How to GraphQL 上的安全教程OWASP 的 GraphQL 备忘单

如何在 GraphQL 中设置授权?#

我们建议在 业务逻辑层 中强制执行授权行为。这样,你就拥有了授权的单一事实来源。

有关更详细的说明,请访问我们的 授权文档

GraphQL 如何实现身份验证?#

您可以使用常见的模式来实现身份验证,例如 OAuthJWT。GraphQL 规范中没有关于身份验证的特殊内容。

一些 GraphQL 库 也包含特定的身份验证协议。但是,如果您使用的是管道模型,我们建议 将 GraphQL 放置在所有身份验证中间件之后

如果您使用 GraphQL.js 构建 API 服务器,我们有关于 使用 Express 中间件处理身份验证 的文档。

GraphQL 是否适合用于设计微服务架构?#

是的,可以。如果您将 GraphQL 集成到您的微服务架构中,我们建议使用一个 GraphQL 架构作为 API 网关,而不是让您的客户端与多个 GraphQL 服务通信。这样,您可以将后端拆分为微服务,但仍然可以从单个 API 将所有数据聚合到前端。

创建 API 网关有很多方法。使用 GraphQL 的好处是,您可以利用缓存、请求预算和查询计划等功能。

GraphQL 如何实现版本控制?#

没有什么可以阻止 GraphQL 服务像其他任何 REST API 一样进行版本控制。也就是说,GraphQL 通过设计避免了版本控制。

相反,GraphQL 提供了持续构建和演化您的架构的工具。例如,GraphQL 只返回显式请求的数据。这意味着您可以添加新功能(以及所有相关的类型和字段),而不会造成破坏性更改或使现有查询的结果膨胀。

您可以在我们的最佳实践部分了解更多关于 GraphQL 中版本控制的工作原理

如何为我的 GraphQL API 编写文档?#

GraphQL 的优势之一是它本身具有自文档功能。这意味着当您使用像 GraphiQL 这样的交互式工具时,您可以探索 GraphQL API 公开的哪些数据。这包括 字段类型 等等。您还可以添加一个 描述字段 来提供有关您的端点的补充说明。此描述字段支持字符串和 Markdown。

对于许多人来说,这提供了足够的 API 参考文档。但这并不能减少对其他形式文档的需求。您可能仍然需要创建指南来解释一般概念如何与您的特定用例相关联。

规范

跟踪规范发布的最佳方法是什么?#

GraphQL 规范的最新工作草案版本可以在 spec.graphql.org/draft 上找到。以前的版本也可以在与它们的 发布标签 匹配的永久链接上找到。

每个版本背后的整个过程都是开源的。您可以通过关注 graphql-spec 存储库中的拉取请求 来监控规范提案。您还可以观看过去关于 YouTube 上各种提案的 GraphQL 工作组讨论 YouTube

如何为 GraphQL 规范做出贡献?#

GraphQL 仍在不断发展,非常欢迎贡献!规范(包括 最新工作草案)是开源的。 贡献者指南 在 GitHub 上提供。

除了规范之外,还有更多方法可以参与 GraphQL。例如,更新 本网站和文档 上的内容。或者为 graphql-jsgraphql-httpGraphiQLGraphQL 基金会维护的众多其他项目之一做出贡献。

什么是 GraphQL 规范成员资格?#

GraphQL 规范 和相关的参考实现是联合开发基金会项目(也是 Linux 基金会家族的一部分)。个人或公司贡献者签署一份免费文件,他们同意他们的贡献在项目的开源许可下。因为这不是 GraphQL 基金会成员资格,所以规范成员不决定如何使用预算。

要签署 GraphQL 规范会员文件,请在任何 GitHub 上的 GraphQL 仓库 上创建一个 PR。

如果您的组织使用并受益于 GraphQL,请考虑通过代表您的公司创建一个 PR 并 加入 GraphQL 基金会 来成为两个组织的成员。

订阅的文档在哪里?#

它还没有在这个网站上,但我们正在努力。如果您想帮助编写有关订阅的指南,请 告诉我们

目前,规范中包含有关 如何编写和执行订阅 的详细信息。

前端

GraphQL 是否取代了 Redux 或其他状态管理库?#

不,GraphQL 不是状态管理库,但它可以减少对状态管理库的需求。

像 Redux 这样的状态管理库的一个好处是,它们可以将 API 响应操作为您的应用程序可以理解的格式。使用 GraphQL,您可以控制 您请求的数据,并且通常结果会通过图设计以对客户端友好的方式进行格式化。因此,此优势已内置。许多 客户端库 也可用于管理状态,并具有内置的缓存等功能。您可能仍然决定实现状态管理库,但通常不需要使用它来格式化响应数据。

GraphQL 基金会

GraphQL 基金会做什么?#

基金会的主要职责是制定政策并分配预算,以最大限度地提高 GraphQL 社区的可持续性。成员参与每月召开的理事会,并决定如何分配其资金。

当我成为会员时,资金将去哪里?#

GraphQL 基金会完全由其成员的支持资助。理事会制定年度预算,以最大限度地利用会费来造福社区。基金会通过会员资格筹集资金的方式包括

  • 为在中立角色中工作的核心社区开发人员提供赠款和赞助。
  • 资助核心社区 IT 基础设施。
  • 为基金会和 GraphQL 项目生态系统提供协调、财务和法律支持计划。
  • 其他社区和开发人员支持计划。

GraphQL 基金会的预算会根据社区需求的变化而调整。

决策是如何做出的?#

与其他 Linux 基金会项目一样,理事会通过投票做出决策。每票都平等,没有成员拥有特殊的投票权或特权。章程目前将理事会成员限制在 25 人。

谁可以加入 GraphQL 基金会?#

GraphQL 基金会会员资格向希望支持 GraphQL 生态系统的公司开放。由于 GraphQL 基金会托管在 Linux 基金会,因此成员也必须加入 Linux 基金会。

我需要加入基金会才能参与 GraphQL 开发吗?#

不需要,基金会会员资格与技术开发社区是分开的。参与 GraphQL 开发没有费用,但您必须签署 免费的 GraphQL 规范会员协议 才能参与。这两件事是不同的。

成员加入基金会是为了提供必要的资金并参与有关如何使用资金的决策。开发人员加入 GraphQL 规范是为了贡献想法、代码和其他内容。许多公司同时做这两件事。

如何参与技术开发?#

我们很乐意有你!最好的起点是 GraphQL 工作组,该小组每月举行会议。打开一个 PR 将自己添加到议程中,欢迎您加入。

否则,您可以参与我们其他任何项目

谁创立了该组织?#

GraphQL 基金会由 Apollo、AWS、Butterfly Network、Dgraph Labs、Facebook、Gatsby、GraphZen、Hasura、IBM、Intuit、Neo4j、Novvum、Pipefy、Salsify、Solo.io 和 Thicit 共同创立。

目前有哪些成员?#

您可以在GraphQL 基金会会员页面上了解更多关于我们会员的信息。

我们如何加入?#

您可以通过填写我们的会员申请表,成为 GraphQL 基金会和 Linux 基金会的成员。