GraphQL 学习指南 (17):GraphQL 查询语言 3

阅读数:5 2019 年 12 月 18 日 20:43

GraphQL学习指南(17):GraphQL查询语言 3

(GraphQL 查询语言)

内容简介
为什么 GraphQL 是 Ajax 诞生以来具创新性的数据获取技术?GraphQL 通过为 API 提供查询语言和用以完成查询的运行状态,提供了对 REST 和特定页面服务架构的替代方案。借助这《GraphQL 学习指南》,Alex Banks 和 Eve Porcello 为希望开始使用 GraphQL 的前端 Web 开发人员、后端工程师以及项目或产品经理提供了一条清晰的学习路径。你将先后探索图论、图数据结构和 GraphQL 类型,之后在实际项目中学习如何为照片共享应用构建 schema。
《GraphQL 学习指南》还将向你介绍 Apollo Client,可用来将 GraphQL 连接到你的用户界面。

在距 GraphQL 开源 45 年前,一位名叫埃德加·科德(Edgar M. Codd)的 IBM 程序员发表了一篇内容不多、名字却很长的论文—“A Relational Model of Data for Large Shared Databanks”。此文虽然标题平淡无奇,其中表达的思想却惊天动地。它概述了使用表格存储和操作数据的模型。此后不久,IBM 开始开发可以使用结构化英文查询语言(Structured English Query Language,SEQUEL)进行查询的关系型数据库,这就是后来的 SQL。

SQL(Structured Query Language,结构化查询语言)是特定的语言,用于访问、管理和操作数据库中的数据。SQL 引入了使用单个命令访问多个记录的概念。它还可以使用任意键(key)来访问记录,而不仅局限于 ID。

SQL 可以运行的命令非常精简:SELECT、INSERT、UPDATE 和 DELETE。这就是你对数据所能做的一切。使用 SQL,可以编写一个查询语句,它可以跨数据库中的多个数据表返回相应的数据。

数据只能被增加、删除、更改和查询的想法确实符合表述性状态传递方式,它要求我们根据这四种基本数据操作使用不同的 HTTP 方法:GET、POST、PUT 和 DELETE。但是,指定通过 REST 读取或更改数据类型的唯一方法是通过端点 URL,而非实际的查询语言。

最初我们开发 GraphQL 的想法是用于查询数据库并将其应用于互联网。单次的 GraphQL 查询就可以返回相关联的数据。与 SQL 一样,你可以使用 GraphQL 查询来更改或删除数据。毕竟,SQL 中的 QL 和 GraphQL 中的 QL 代表了相同的东西:查询语言(Query Language)。

尽管都是查询语言,但 GraphQL 和 SQL 却完全不同。它们适用于完全不同的环境。我们将 SQL 查询语句发到数据库,而 GraphQL 查询语句则发到 API。SQL 数据存储在数据表中。GraphQL 数据则可以存储在任何地方:单个数据库、多个数据库、文件系统、RESTful API、WebSockets,甚至是其他 GraphQL API。SQL 是一种数据库的查询语言,而 GraphQL 则是一种互联网查询语言。

GraphQL 和 SQL 的语法也完全不同。GraphQL 使用查询(Query)字段去请求数据而非 SELECT。查询字段是我们使用 GraphQL 操作的核心。不同于 INSERT、UPDATE 或者 DELETE,GraphQL 将所有这些数据整合成为一种数据类型:变更(Mutation)。因为 GraphQL 是为互联网而生的,所以它具有订阅功能,可以用来监听 socket 连接上的数据变动。SQL 可不具备订阅功能。

GraphQL 是依照规范进行标准化的。使用哪种语言并不重要:只要是 GraphQL 查询字段就行了。无论你的项目使用的是 JavaScript、Java、Haskell 或是其他什么语言,查询字段基本一致。

查询字段仅仅是发送到 GraphQL 端的 POST 请求体中的字符串。下面是一个普通的 GraphQL 查询字段:

复制代码
{
allLifts {
name
}
}

你可以使用 curl 将该查询字段发送到 GraphQL 端:

复制代码
curl 'http://snowtooth.herokuapp.com/'
-H 'Content-Type: application/json'
--data '{"query":"{ allLifts {name }}"}'

假设 GraphQL schema 支持这种形式的查询,你将直接收到响应的 JSON。JSON 中包含你在名为 data 的字段中请求的数据,或者出错的时候返回的报错信息。流程很简单,发出请求,收到响应。

如果要更改数据,我们可以发送变更(mutation)。变更和查询字段颇为相似,而它是用来修改数据的,类似于 SQL 的 UPDATE。执行更改所需要的数据可以和变更一起直接发送,请看下面的例子:

复制代码
mutation {
setLiftStatus(id: "panorama" status: OPEN) {
name
status
}
}

上面的变更是采用 GraphQL 查询语言编写的,可以假设它想要把 id 为 panorama 的 lift 的状态改为 OPEN。同样,可以使用 curl 将该操作发送到 GraphQL 服务器:

复制代码
curl 'http://snowtooth.herokuapp.com/'
-H 'Content-Type: application/json'
--data '{"query":"mutation {setLiftStatus(id: \"panorama\" status: OPEN) {name status}}"}'

随后将详细介绍将变量映射到查询或变更中的更好的方法。在本章中,我们将重点介绍如何使用 GraphQL 来构成查询(query)、变更(mutation)和订阅(subscription)。

GraphQL学习指南(17):GraphQL查询语言 3

购书地址 https://item.jd.com/12639300.html?dist=jd

评论

发布