GraphQL 到底是什么?

GraphQL 到底是什么?

一句话来定义 GraphQL:GraphQL 是一种描述请求数据方法的语法,通常用于客户端从服务端加载数据。

它有 3 个显著的特征:

它允许客户端指定具体所需的数据。

它让从多个数据源汇总取数据变得更简单。

它使用了类型系统来描述数据。

历史背景

GraphQL 是由 Facebook 开发的,用于解决他们巨大、老旧的架构的数据请求问题。但是即使是比 Facebook 小很多的 app,也同样会碰上一些传统 REST API 的局限性问题。

例如,假设你要展示一个文章(posts)列表,在每篇文章的下面显示喜欢这篇文章的用户列表(likes),其中包括用户名和用户头像。这个需求很容易解决,你只需要调整你的 posts API 请求,在其中嵌入包括用户对象的 likes 列表,如下所示:

19162DFCCC43BB3FC14D8FFDEAFDC39D.jpg

但是现在你是在开发移动 app,加载所有的数据明显会降低 app 的速度。所以你得请求两个接口(API),一个包含了 likes 的信息,另一个不含这些信息(只含有文章信息)。

现在我们再掺入另一种情况:posts 数据是由 MySQL 数据库存储的,而 likes 数据却是由 Redis 存储的。现在你该怎么办?

按着这个剧本想一想 Facebook 的客户端有多少个数据源和 API 需要管理,你就知道为什么现在评价很好的 REST API 所体现出的局限性了。

解决的方案

Facebook 提出了一个概念很简单的解决方案:不再使用多个“愚蠢”的节点,而是换成用一个“聪明”的节点来进行复杂的查询,将数据按照客户端的要求传回。

实际上,GraphQL 层处于客户端与一个或多个数据源之间,它接收客户端的请求然后根据你的设定取出需要的数据。还是不明白吗?让我们打个比方吧!

之前的 REST 模型就好像你预定了一块披萨,然后又要叫便利店送一些日用品上门,接着打电话给干洗店去取衣服。这有三个商店,你就得打三次电话。

0CB551D0229EF482D45A34C80BFC1110.jpg

GraphQL 从某方面来说就像是一个私人助理:你只需要给它这三个店的地址,然后简单地告诉它你需要什么 (“把我放在干洗店的衣服拿来,然后带一块大号披萨,顺便带两个鸡蛋”),然后坐着等他回来就行了。

764CE7295D4BF870CF84A07EF6FE0822.jpg

换句话说,为了让你能和这个神奇的私人助手沟通,GraphQL 建立了一套标准的语言。

一个例子

设想我们使用 GraphQL 查询数据,你只需要写出下面的代码即可

query { 
client(id: 1) { 
    id
    name 
  } 
}

你的第一印象:“这个不是JSON?”。

还真不是!就如我们之前说的,GraphQL设计的中心是为客户端服务。

GraphQL的设计者希望可以写一个和期待的返回数据schema差不多的查询。

那么后端会返回什么呢?

{
  "data": {
    "client": {
      "id": "1",
      "name": "Uncle Charlie"
    }
  }
}

就如我们期望的,server会返回一个JSON串。这个JSON的schema和查询的基本一致。

EC838A77B773EC7D676FB8D3965A2482.gif