Skip to content

Latest commit

 

History

History
57 lines (41 loc) · 4.33 KB

ch03_00.md

File metadata and controls

57 lines (41 loc) · 4.33 KB

GraphQL查询语言

在GraphQL开源的45年前,IBM员工 Edgar M. Codd 发布了一篇内容相当简短,然而标题很长的论文:《大型共享数据库的数据关系模型》。论文的标题并不时髦,但它包含了一些强大的想法。它勾勒出一个使用表来存储和操作数据的模型。很快,IBM开始研究一种关系型数据库,它可以使用结构化英文查询语言(Structured English Query Language/SEQUEL)查询数据,后来,它被称作SQL。

SQL或者说结构化查询语言,是一种特定域的语言,它用来访问、管理和操作数据库中的数据。SQL引入了通过一条命令来操作记录的概念。也让通过任何键值(而不仅仅是ID)访问任何数据成为可能。

SQL中可以运行的命令十分精简:SELECT、INSERT、UPDATE和DELETE。这就是所有你可以对数据进行的操作。通过SQL,我们写一条查询语句,就可以取出数据库中的多个数据表中互相关联的数据。

这个想法——即数据只能被增删改查——继续发展出了表述型状态传输(REST)。REST要求我们根据四种基本数据操作使用不同的HTTP方法:GET、POST、PUT和DELETE。然而,指定要使用REST读取或修改的数据类型的唯一方式是通过终端URL,而不是实际的查询语言。

GraphQL采用了这些最初被开发用于查询数据库的思路,并在互联网上应用他们。一个GraphQL查询可以返回互相关联的数据。就像SQL一样,你可以用GraphQL来改变或删除数据。毕竟,SQL和GraphQL中的QL是一个意思:查询语言(Query Language)。

虽然都是查询语言,GraphQL和SQL完全不同。他们适用于不同的环境。SQL适用于数据库,GraphQL适用于API。SQL数据在数据表中存储,GraphQL数据可能存储在任何地方:一个数据库、多个数据库、文件系统、REST API、WebSockets甚至是其它GraphQL API。SQL是一种数据库的查询语言。GraphQL是一种互联网的查询语言。

GraphQL和SQL语法也完全不同。不同于SELECT,GraphQL使用Query来请求数据。这个操作是我们使用GraphQL的核心。不同于INSERT、UPDATE或DELETE,GraphQL把这些改变数据的操作转换成了一种类型:突变。因为GraphQL构建用于互联网,它包括一种“订阅”类型,可以在通过socket监听数据变化时使用。SQL中没有什么像“订阅”。SQL就像孙辈和祖父长得不像,但我们仍知道他们有关联,因为他们的姓一样(QL)。

GraphQL是一种标准化查询语言。使用何种编程语言无关紧要:GraphQL查询是GraphQL查询。查询语法是一个看起来相同的字符串,无论项目是使用JavaScript,Java,Haskell还是其他任何什么。 查询只是在POST请求主体中发送到GraphQL终端的字符串。以下是GraphQL查询,一个用GraphQL查询语言编写的字符串:

{
  allLifts {
    name
  }
}

你可以使用curl发送这个查询到GraphQL终端:

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

假定GraphQL支持这种格式的查询,你将直接在终端收到一个JSON响应。JSON响应包含了你在叫做data的字段中请求的数据,或者包含错误字段(如果出错)。我们发起一个请求;我们得到一个回应。为了修改数据,我们可以发送突变,突变看起来像查询,但突变的目的是改变应用程序的整体状态。执行变更的数据可以被直接用突变发送,如下所示:

mutation {
  setLiftStatus(id: "panorama" status: OPEN) {
    name
    status
  }
}

上面的突变是用GraphQL写的,我们可以假定它将改变id是panaroma的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构造查询、m突变和订阅。

👈 上一节 下一节 👉