GraphQL 到底是什么?
GraphQL 到底是什么?
一句话来定义 GraphQL:GraphQL 是一种描述请求数据方法的语法,通常用于客户端从服务端加载数据。
它有 3 个显著的特征:
它允许客户端指定具体所需的数据。
它让从多个数据源汇总取数据变得更简单。
它使用了类型系统来描述数据。
历史背景
GraphQL 是由 Facebook 开发的,用于解决他们巨大、老旧的架构的数据请求问题。但是即使是比 Facebook 小很多的 app,也同样会碰上一些传统 REST API 的局限性问题。
例如,假设你要展示一个文章(posts)列表,在每篇文章的下面显示喜欢这篇文章的用户列表(likes),其中包括用户名和用户头像。这个需求很容易解决,你只需要调整你的 posts API 请求,在其中嵌入包括用户对象的 likes 列表,如下所示:

但是现在你是在开发移动 app,加载所有的数据明显会降低 app 的速度。所以你得请求两个接口(API),一个包含了 likes 的信息,另一个不含这些信息(只含有文章信息)。
现在我们再掺入另一种情况:posts 数据是由 MySQL 数据库存储的,而 likes 数据却是由 Redis 存储的。现在你该怎么办?
按着这个剧本想一想 Facebook 的客户端有多少个数据源和 API 需要管理,你就知道为什么现在评价很好的 REST API 所体现出的局限性了。
解决的方案
Facebook 提出了一个概念很简单的解决方案:不再使用多个“愚蠢”的节点,而是换成用一个“聪明”的节点来进行复杂的查询,将数据按照客户端的要求传回。
实际上,GraphQL 层处于客户端与一个或多个数据源之间,它接收客户端的请求然后根据你的设定取出需要的数据。还是不明白吗?让我们打个比方吧!
之前的 REST 模型就好像你预定了一块披萨,然后又要叫便利店送一些日用品上门,接着打电话给干洗店去取衣服。这有三个商店,你就得打三次电话。

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

换句话说,为了让你能和这个神奇的私人助手沟通,GraphQL 建立了一套标准的语言。
一个例子
设想我们使用 GraphQL 查询数据,你只需要写出下面的代码即可
query {
client(id: 1) {
id
name
}
}
你的第一印象:“这个不是JSON?”。
还真不是!就如我们之前说的,GraphQL设计的中心是为客户端服务。
GraphQL的设计者希望可以写一个和期待的返回数据schema差不多的查询。
那么后端会返回什么呢?
{
"data": {
"client": {
"id": "1",
"name": "Uncle Charlie"
}
}
}
就如我们期望的,server会返回一个JSON串。这个JSON的schema和查询的基本一致。

参考资料:
https://www.freecodecamp.org/news/so-whats-this-graphql-thing-i-keep-hearing-about-baf4d36c20cf/ by Sacha Greif