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”
}
}
想象一下,一个客户端应用程序查询用户详细信息,获取结果,并使用它来填充个人资料屏幕。 作为一种查询语言,GraphQL 的核心优势之一是客户端应用程序可以仅请求它需要的数据,并期望以一致的方式返回数据。
是什么返回 GraphQL 响应呢? 这就是执行引擎(通常以 GraphQL 服务器的形式)发挥作用的地方。
执行引擎

GraphQL 执行引擎负责处理 GraphQL 查询并返回 JSON 响应。 所有 GraphQL 服务器都由两个核心组件组成,这两个组件定义了执行引擎的结构和行为:分别是模式和解析器。
GraphQL 模式是一种自定义类型语言,它公开了哪些查询是 GraphQL 服务器实现允许(有效)和处理的。 上面我们用户示例查询的模式可能如下所示
type User {
name: String
email: String
phoneNumber: String
}
type Query {
user: User
}
此模式定义了一个返回用户的用户查询。 客户端可以通过用户查询请求用户上的任何字段,GraphQL 服务器将仅在其响应中返回这些字段。 通过使用强类型模式,GraphQL 服务器可以验证传入的查询,以确保它们基于定义的模式是有效的。
一旦确定查询有效,它将由 GraphQL 服务器通过解析器进行处理。 解析器函数支持每个 GraphQL 类型的每个字段。 我们用户查询的示例解析器可能如下所示
Query: {
user(obj, args, context, info) {
return context.db.loadUserById(args.id).then(
userData => new User(userData)
)
}
}
虽然上面的示例是用 JavaScript 编写的,但 GraphQL 服务器可以用任何数量的语言编写。 这是因为 GraphQL 也是一个规范!
规范
GraphQL 规范定义了 GraphQL 实现必须遵循的功能和特性。 作为一个根据开放 Web 基金会最终规范协议 (OWFa 1.0) 提供的开放规范,技术社区有机会审查 GraphQL 实现必须做什么才能符合规范,并帮助塑造该语言的未来。
虽然该规范对 GraphQL 的语法、什么是有效查询以及模式如何工作非常具体,但它没有提供关于如何存储数据或 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 将如何改变您构建应用程序的方式,它是否名副其实? 只有一种方法可以找到答案——走出去,用 GraphQL 构建一些东西!
1 条评论