搜索

简体中文

登录 Account

登录 / 注册 Account

网站

API

什么是 GraphQL?

GraphQL 是一种用于应用编程接口(API)的查询语言和服务器端运行时,它可以使客户端准确地获得所需的数据,没有任何冗余。 

GraphQL 旨在让 API 变得快速、灵活并且为开发人员提供便利。作为 REST 的替代方案,GraphQL 允许开发人员构建相应的请求,从而通过单个 API 调用从多个数据源中提取数据。 

此外,GraphQL 还可让 API 维护人员灵活地添加或弃用字段,而不会影响现有查询。开发人员可以使用自己喜欢的方法来构建 API,并且 GraphQL 规范将确保它们以可预测的方式在客户端发挥作用。

模式、解析器及其他常见的 GraphQL 术语

API 开发人员使用 GraphQL 创建一个模式,来描述客户端可通过该服务查询的所有可能数据。 

GraphQL 模式由对象类型组成,它表示可以请求哪种对象以及它有哪些字段。 

查询时,GraphQL 会根据模式对查询进行验证。随后,GraphQL 将执行经过验证的查询。

API 开发人员将模式中的每个字段附加到名为解析器的函数中。执行期间,系统将调用解析器来生成相应的值。

除了为 API 查询定义和验证语法外,GraphQL 把大部分决策权都留给了 API 设计人员。GraphQL 不会提供有关如何存储数据或使用哪种编程语言的任何指导。它对网络、授权或分页没有任何要求。

从客户端的角度看,最常见的 GraphQL 操作可能就是查询修改。如果按照创建、读取、更新和删除(CRUD)模型来审视这些操作,那么查询就等同于读取。其他所有操作(创建、更新删除)均视为修改。

GraphQL 在企业环境中的利弊

想在业务或企业环境中试用 GraphQL?这样做既有优点,也有缺点。

优点

  • GraphQL 模式会在 GraphQL 应用中设置单一事实来源。它为企业提供了一种整合其整个 API 的方法。
  • 一次往返通讯可以处理多个 GraphQL 调用。客户端可得到自己所请求的内容,不会超量。
  • 严格定义的数据类型可减少客户端与服务器之间的通信错误。 
  • GraphQL 具有自检功能。客户端可以请求一个可用数据类型的列表。这非常适合文档的自动生成。
  • GraphQL 允许应用 API 进行更新优化,而无需破坏现有查询。
  • 许多开源 GraphQL 扩展可提供 REST API 所不具备的功能。
  • GraphQL 不指定特定的应用架构。它能够以现有的 REST API 为基础,并与现有的 API 管理工具配合使用。

缺点

  • 即便是熟悉 REST API 的开发人员,也需要一定时间才能掌握 GraphQL。
  • GraphQL 将数据查询的大部分工作都转移到服务器端,由此增加了服务器开发人员工作的复杂度。
  • 根据不同的实施方式,GraphQL 可能需要不同于 REST API 的 API 管理策略,尤其是在考虑速率限制和定价的情况下。
  • 缓存机制比 REST 更加复杂。
  • API 维护人员还会面临编写可维护 GraphQL 模式的额外任务。

GraphQL 查询示例

想要更好地了解 GraphQL,最好的办法就是看一些查询和响应的示例。我们来看看来自 GraphQL 项目网站中的 3 个示例。

第一个示例显示了客户端如何构建 GraphQL 查询,从而要求 API 以指定的形态返回特定字段。

{ me { name } }

GraphQL API 将以 JSON 格式返回如下结果:

{ "me": { "name": "Dorothy" } }

客户端也可以作为 GraphQL 查询的一部分来传递参数,如下例所示:

{ human(id: "1000") { name location } }

结果为:

{ "data": { "human": { "name": "Dorothy, "location": "Kansas" } } }

从这里开始,事情变得更加有趣。GraphQL 允许用户定义可复用的片段并分配变量。

假设您需要请求一个 ID 列表,然后为每个 ID 请求一系列记录。借助 GraphQL,您可以构建一个查询,然后通过单个 API 调用来提取所需的所有内容。 

查询方式如下:

query HeroComparison($first: Int = 3) { leftComparison: hero(location: KANSAS) { ...comparisonFields } rightComparison: hero(location: OZ) { ...comparisonFields } } fragment comparisonFields on Character { name friendsConnection(first: $first) { totalCount edges { node { name } } } }


可能生成以下结果:

{ "data": { "leftComparison": { "name": "Dorothy", "friendsConnection": { "totalCount": 4, "edges": [ { "node": { "name": "Aunt Em" } }, { "node": { "name": "Uncle Henry" } }, { "node": { "name": "Toto" } } ] } }, "rightComparison": { "name": "Wizard", "friendsConnection": { "totalCount": 3, "edges": [ { "node": { "name": "Scarecrow" } }, { "node": { "name": "Tin Man" } }, { "node": { "name": "Lion" } } ] } } } } 

如果您是 GitHub 用户,那么使用 GitHub 的 GraphQL Explorer 就能快速上手 GraphQL。

GraphQL 与开源

GraphQL 由 Facebook 开发,并于 2012 年首次应用于移动应用。GraphQL 规范于 2015 年实现开源。现在,它受 GraphQL 基金会监管。

有大量开源项目都涉及 GraphQL。下面的列表虽不详尽,但大致涵盖了一些旨在促进 GraphQL 普及的项目。

  • Apollo:一个包含客户端库和服务器框架的 GraphQL 平台。
  • Offix:一个离线客户端,即使在无法访问应用的情况下也允许执行 GraphQL 修改与查询。
  • Graphback:一个用于生成支持 GraphQL 的 Node.js 服务器的命令行客户端。
  • OpenAPI-to-GraphQL:一个用于将 OpenAPI 规范或 Swagger 所描述的 API 转换为 GraphQL 的命令行界面和库。

探索红帽的 API 产品

能让您轻松地针对内部或外部用户,实现 API 共享、保护、分发、控制和盈利。

分布式云原生集成平台,可以连接位于企业本地、云端以及两者之间的 API。