GraphQL 是一种查询语言、一个执行引擎,也是一种规范,它让开发人员重新思考如何构建客户端和 API 应用。
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 实现必须遵循的功能和特性。作为一个在开放网络基金会的最终规范协议([OWFa 1.0](http://www.openwebfoundation.org/legal/the-owf-1-0-agreements/owfa-1-0
via: https://opensource.com/article/19/6/what-is-graphql
作者:Zach Lendon 选题:lujun9972 译者:geekpi 校对:wxy
发表回复