这才是GraphQL最详尽的解释

1,467 阅读5分钟

翻译:疯狂的技术宅

原文:opensource.com/article/19/…

未经允许严禁转载

GraphQL是一种查询语言、一种执行引擎和一种规范,它引领开发人员重新思考应该怎样去构建客户端和API。

图片来源: JuralMin, CC0. Modified by Jason Baker.

GraphQL 是当今软件技术领域最大的流行语之一。但它究竟是什么?它是一种像 SQL 这样的查询语言吗?像 JVM 这样的执行引擎?像 XML 这样的规范?

只有回答了以上所有问题,才是正确答案! GraphQL 是一种查询语言语法,与编程语言无关的执行引擎,以及不断发展的规范。

让我们深入了解 GraphQL 是怎样成为这些东西的,并探究人们对此感到兴奋的原因。

查询语言

GraphQL 作为一种查询语言似乎是合理的 —— 毕竟其中包含了“QL”这个字眼。但是我们在查询什么呢?下面关于查询请求和对应的响应的例子可能会对你的理解有所帮助。

以下用户查询:

{
 user(id: 4) {
   name
   email
   phoneNumber
 }
}

可能会返回以下 JSON 响应:

{
 "user": {
   "name": "Zach Lendon"
   “email”: “zach@hydrate.io”
   “phoneNumber”: “867-5309”
 }
}

假设客户端程序查询 user 的详细信息,然后获取结果并显示在屏幕上。作为一种查询语言,GraphQL 的核心优势之一是客户端程序只能请求其所需要的数据,并以一致的形式返回它。

什么是返回 GraphQL 响应?这就是执行引擎(通常以GraphQL服务器的形式)的用武之地。

执行引擎

GraphQL执行引擎

GraphQL 执行引擎负责处理 GraphQL 查询并返回 JSON 响应。所有 GraphQL 服务器都由两个核心组件组成:模式和解析器,这两个组件分别定义了执行引擎的结构和行为。

GraphQL schema 是一种自定义类型语言,它公开了 GraphQL 服务器实现允许(有效的)和处理哪些查询。上面的用户查询案例的架构可以如下所示:

type User {
        name: String
        email: String
        phoneNumber: String
}

type Query {
        user: User
}

这些 schema 定义了返回 user 数据的查询。客户端可以通过 user 查询请求 user 的所有字段,GraphQL 服务器在响应中仅返回那些字段。通过使用强类型模式,GraphQL 服务器可以验证传入的查询,以确保它们基于所定义的 schema。

一旦确定查询是有效的,则交给 GraphQL 服务器的解析器处理。解析器函数支持每个 GraphQL 类型的所有字段。user 查询的解析器如下所示:

Query: {
  user(obj, args, context, info) {
    return context.db.loadUserById(args.id).then(
      userData => new User(userData)
    )
  }
}

虽然上面的例子是由 JavaScript 编写的,但 GraphQL 服务器可以用任何一种语言编写。这是因为 GraphQL 本身也是一种规范!

规范

GraphQL 规范定义了实现 GraphQL 所必须遵循的功能和特性。作为 Open Web Foundation 最终规范协议下的开放规范(目前只有 OWFa 1.0 ),技术社区有机会审查 GraphQL 的实现必须怎样做才能符合规范,并帮助制定这种语言的未来。

虽然规范对 GraphQL 的语法的说明非常的具体,例如什么是有效查询以及 schema 如何工作,但它没有规定怎样对数据进行存储和 GraphQL 服务器应该用哪种编程语言实现。这在软件领域是非常强大而且独特的 —— 它允许用任何一种编程语言去实现 GraphQL 服务器,并且客户端能够准确的了解它们的功能,因为它们是符合规范的。并且已经有了基于多种编程语言的 GraphQL 服务器实现,不仅仅是人们通常认为的 JavaScript、Java 和 C#,还有 Go、Elixir 和 Haskell 等语言。服务器的实现语言不会成为障碍 —— 不仅有许多语言的实现,而且它们都是开源的。如果你选择的语言还没有对应的实现,也可以创建自己的实现。

总结

GraphQL 是一个令人兴奋的、相对较新的开源 API。它将查询语言、执行引擎与开源规范相结合,该规范定义了 GraphQL 实现的外观和功能。

GraphQL 正在改变构建客户端和 API 应用的方式。把 GraphQL 作为自己技术堆栈的一部分,前端开发者可以自由地查询他们想要的数据,而后端开发者可以将客户端程序的需求与其后端系统架构分离。一些公司通常先构建一个位于其现有后端服务之上的 GraphQL API “层”,从而开始使用 GraphQL。这使得客户端程序可以得到他们寻求的性能和运营效率,同时允许后端团队在其系统的 GraphQL 层后面进行“改进”(如果需要的话)。通常这些改进是针对性能优化的,这将有助于确保使用 GraphQL 的程序高效地运行。由于 GraphQL 提供的抽象能力,系统团队可以在继续遵守 GraphQL API 级别的规范的前提下进行这些改进。

由于 GraphQL 相对较新,开发人员仍在不断的寻找更好的使用它的方案。 GraphQL 将如何改变你的开发方式并使你获得成功?只有一种方法——用 GraphQL 去实现一些东西!

欢迎关注前端公众号:前端先锋,获取前端工程化实用工具包。