GraphQL 概念入门
Restful is Great! But GraphQL is Better. – My Humble Opinion.
GraphQL will do to REST what JSON did to XML. – Samer Buna from Quora
GraphQL 作为 Facebook 的前端三架马车之一(另外两架是 Relay 和 React, 三者可以无缝结合),提出也有一段时间了,但真正用过的人却出奇的少,
截止到 2018 年底,根据 Stateofjs 的数据看,
虽然只有 1/5 的开发人员用过,但却有高达 62.5% 的人表示听过并想试试😂 果然咸鱼才是主流呀;
接下来我会就 GraphQL 的前后端应用出个系列文章介绍 GraphQL 及其使用感受,顺便填坑。
本系列将以 Python + Django + Graphene 作为后端服务端。Apollo 作为前端客户端。
1. 什么是 GraphQL
官方是这么说的:
GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。
GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,
也让 API 更容易地随着时间推移而演进,还能用于构建强大的开发者工具。
我总结一下:
首先 GraphQL 它是一种跟 Restful 标准类似的查询语言。它们的功能层级类似(如下图),但从实际应用、理念上说的话,它们是完全不一样的两种形态。
Restful 主张的是 “一切数据皆视为资源”,
在理想情况下:不同的请求内容对应着一个唯一的 ID. 不同的数据动作对应到不同的 HTTP 方法上。
GraphQL 主张的是 “一切数据皆视为数据(树状的)”,
不同的请求内容都会对应到同一个 HTTP 地址,也会对应到同一个 HTTP 方法(POST)。
不同的动作由操作符决定。它的总体体验会更像是一个 SQL Shell, 你需要什么就请求什么,你不需要的内容它也不会硬塞给你。
与 Restful 类似,他们都只是个标准,不同产品它们的具体实现也是有所出入的,没有完全实现所有特性也是正常的。
但主要的功能及特性是在所有实现中都有的。另外两者的不同语言支持基本差不多,常见语言都能有对应的实现。
下面我会就两者的差异进行相对详细的比较,
由于 Restful 算是个比较通用的标准了,下面我不会详细介绍 Restful 的具体内容,
如果你不熟悉 Restful 标准的话最好先了解一下后再继续,以便更好地理解。
2. GraphQL 与 Restful 的数据操作对比
2.1 查询
Restful 主张一切数据皆视为资源,这意味着不同的数据你会需要多次请求,
比如一个像我这样的 SPA 类型的个人博客,你大概会在进入主页时请求这些内容(纯假设,非实际情况):
// 一些配置类信息:比如配置项、站点标题等
https://example.com/config/
// 侧边的标签栏
https://example.com/tags/
// 侧边的归档栏
https://example.com/archives/
// 公告信息栏
https://example.com/billboard/
// 文章的列表
https://example.com/articles/
像这样一个单页博客一进主页时必然要请求的信息就要这么多,想象一下如果是一个高并发的、内容结构复杂的网站那请求数量会有多大。
但这些在 GraphQL 中的话,你只需要请求一次,比如:
query {
config: {
key,
value,
}
tags: {
name,
}
archives: {
name,
}
billboard
articles {
id,
name,
description,
tags: {
name,
},
}
}
然后,接口的返回内容会类似这样:
data: {
config: