当前位置: 首页 > 工具软件 > graphql-cli > 使用案例 >

认识GraphQL

刁茂才
2023-12-01

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

 类似资料: