GraplQL是什么?能干啥?
一种查询语言,一种是Facebook开发的API查询语言。
GraphQL 这种方式能够将原有 RESTful 风格时的多次请求聚合成一次请求,可以定制查询结果(结构)。
和REST API的区别:
REST
- 1、返回的数据格式和类型都是定义好的,如果想前后端保持预期效果,
- 1)协调后端改接口(工作量/频繁改动);
- 2)前端自己做适配(会增加网络传输量)。
- 2、某前端展现需要调用多个RESTful API才能获取到足够的数据时,必须要拉取的全部的数据之后,才能绘制界面。
GraphQL
- 所见即所得,查询的返回结果就是输入的查询结构的精确映射
- 查询
{
user(uid:1) {
uid
name
}
}
- 结果
{
"data": {
"user": {
"uid": "1",
"name": "xxx"
}
}
}
- 减少网络请求次数:GraphQL 将原有 RESTful 风格时的多次请求聚合成一次请求:
- 减少多次请求带来的延迟
- 降低服务器压力,加快前端的渲染速度。
- 它的类型系统也非常丰富,除了标量、枚举、列表和对象等类型之外,还支持接口和联合类型等高级特性
- 提供调试工具 GraphiQL,并可以通过代码生成文档,节约文档的维护成本和沟通成本
区别
- REST API中客户端无法控制服务器返回的数据,存在网络和内存资源的浪费。使用GraphQL开发人员可以声明式地来表达其用户界面的数据需求。他们声明他们需要什么数据,而不是如何获取它。
- REST API多端点本质(每个端点代表一个资源),这要求客户端进行多次往返以获取数据。而GraphQL可以随时通过单次往返服务器获取视图所需的所有初始数据。
使用GraphQL
基本概念
- Type(数据模型的抽象)
- Schemas(获取数据的逻辑
- query(查询)
- mutation(更改)
- subscription(订阅)
- Resolve(解析函数)
schema {
query: Query //所有查询请求
mutation: Mutation //所有改变服务器资源的请求
}
GraphQL大体的解析流程就是遇到一个Query之后,尝试使用它的Resolver取值,之后再对返回值进行解析,这个过程是递归的,直到所解析Field的类型是Scalar Type(标量类型)为止。
go get github.com/graphql-go/graphql
-
GraphQL的schema可以自动生成,具体操作可查看graphq-cli文档,步骤大致包括npm包的安装、graphql-cli工具的安装,配置文件的更改(此处需要指定服务对外暴露的地址) ,执行graphql get-schema 命令。
- (https://www.jianshu.com/p/e209f8a7a69d)
- https://github.com/graphql-cli/graphql-cli
-
DataLoader
-
分页
-
test_case
query {
user(id: "1001"){
id,
name,
friends{
id,
name
}
}
}
query {
order(token:"Token a7c89cc30732b191cf6aa5ce43c99cscfsvfe9",
sn_startswith:"",
limit:3,
page:1)
{
id
sn
price
order_item{
id
item_sn
sku_name
}
}
}
自省查询可能是你在GraphQL中唯一的GET请求。不管是query还是mutation,如果你要传递请求体,GraphQL请求方式都应该是POST
查询__schema以列出所有该schema中定义的类型,并获取每一个的细节
query {
__schema {
types {
name
kind
description
fields {
name
}
}
}
}
查询__type以获取任意类型的细节
query {
__type(name: "Repository") {
name
kind
description
fields {
name
}
}
}
参考资料:
官网入门:http://graphql.cn/learn/
https://docs.shenjian.io/use/graphql/graphql.html