入门指南:什么是 GraphQL?

复制 URL

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

GraphQL有什么用?

GraphQL 旨在让 API 变得快速、灵活并且为开发人员提供便利。它甚至可以部署在名为 GraphiQL集成开发环境(IDE)中。作为 REST 的替代方案,GraphQL 允许开发人员构建相应的请求,从而通过单个 API 调用从多个数据源中提取数据。

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

有效 API 管理的 7 大关键

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

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

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

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

除了为 API 查询定义和验证语法外(有关概述见 graphql-spec 存储库),GraphQL 把大部分决策权都留给了 API 设计人员。GraphQL 不提供有关如何存储数据或使用哪种编程语言的任何指导;开发人员可以使用PHP(graphql-php)、Scala(Sangria)、Python(Graphene Python)、Ruby(graphql-ruby)、JavaScript(graphql.js)等等。GraphQL 对网络、授权或分页没有任何要求。

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

红帽资源

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

GraphQL 的优点

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

GraphQL 的缺点

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

GraphQL 查询示例

想要更好地了解 GraphQL,最好的办法就是看一些查询和响应的示例。我们来看看来自 GraphQL 项目网站 graphql.org 的 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 由 Facebook 开发,并于 2012 年首次应用于移动应用。GraphQL 规范于 2015 年实现开源。现在,它受 GraphQL 基金会监管。

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

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

红帽官方博客

获取有关我们的客户、合作伙伴和社区生态系统的最新信息。

所有红帽产品试用

我们的免费试用可让您亲身体验红帽的产品功能,为获得认证做好准备,或评估某个产品是否适合您的企业。

扩展阅读

什么是应用集成?

应用集成可将不同的系统和应用连接起来,使它们可通过交换数据和使用服务进行协作。

一文看懂 API 是什么,有什么用?- 红帽

应用编程接口(API)是一组用于构建和集成应用软件的定义和协议。通过向合作伙伴或公众提供您的 API,可以:创造新的收入渠道,扩大您的品牌覆盖范围,通过外部开发和协作,推动开放创新或提高效率。

什么是 REST API?

REST API 也称为 RESTful API,是一种遵循 REST 架构规范的应用编程接口。REST 是表述性状态传递的英文缩写。

集成 相关资源