GraphQL的探索之路 – 一种为你的API而生的查询语言 - 第314篇

相关历史文章(阅读本文之前,您可能需要先看下之前的系列

国内最全的Spring Boot系列之三

Docker优雅的关闭SpringBoot - 第310篇

「字节码插桩」统计方法耗时(第一篇:初出茅庐)- 第311篇

「字节码插桩」统计方法耗时(第二篇:崭露头角)- 第311篇

「字节码插桩」统计方法耗时(第三篇:叱咤风云)- 第313篇

2020上半年发文汇总「值得收藏」

 

师傅:徒儿,这几个星期,你找个技术点自我研究学习下。

悟纤:师傅,你这是抛弃徒儿了嘛?┭┮﹏┭┮

GraphQL的探索之路 – 一种为你的API而生的查询语言 - 第314篇_第1张图片

 

师傅:你又想哪里去了,这是训练下你自我学习能力,再说了师傅也不能一直陪在你身边呀,你总的学会自我成长呢。

GraphQL的探索之路 – 一种为你的API而生的查询语言 - 第314篇_第2张图片

 

悟纤:看来师傅是用心良苦呐,徒儿错怪师傅了。师傅,徒儿这就去找个技术点研究下。 

GraphQL的探索之路 – 一种为你的API而生的查询语言 - 第314篇_第3张图片

说明

       在接下来的文章主要介绍:

(1)GraphQL是什么?

(2)GraphQL在SpringBoot中如何集成?

 

一、GraphQL的官方介绍

       我们进入GraphQL的官方文档:https://graphql.cn ,可以看到一段话:

GraphQL的探索之路 – 一种为你的API而生的查询语言 - 第314篇_第4张图片

 

       是不是看着感觉不知所云呐?那听我慢慢道来。

 

二、GraphQL的探索之路

2.1 GraphQL的定义

       GraphQL 是一种 API 查询语言, 用于服务器端执行按已定义类型系统的查询. GraphQL 不与任何特定的数据库或存储引擎进行绑定, 而是由您的代码和数据支持.(官方描述)。

       上面这句话不好理解,看看下面这个解释:

GraphQL 是一种针对 Graph(图状数据)进行查询特别有优势的 Query Language(查询语言),所以叫做 GraphQL。

       说白了就是想要什么, 就传入什么字段, 也就会返回什么字段, 具体字段处理是服务器所提供, 而 graphql 并不会关心服务器怎么处理。

举例说明:

传统的rest api:

/user/{id}  return { id, name, age } 是一成不变的,

graphql

findUser(id: xx)  return { id, name }  (注: 传输参数id, 指定返回字段 id, name, 当然也可以写{ name, age },完全取决于前端需求 )

       是不是还不懂,没有关系,先接着往下看。

 

2.2 GraphQL的小历史

       早在2012年,Facebook认为人们只有在离开PC的时候才会用智能手机,很快他们就发现这个认识是多么的错误!于是Facebook把注意力从Web移到了智能终端上。在那个时候,他们严重的依赖于RESTful API。大量的并发请求和对补充数据的二次请求给他们造成了很大的麻烦,尤其是响应时间。一个解决方案是设计足够多的资源来满足单次的请求。但是,这造成了服务端的扩展和维护困难。

在寻找更好的解决方案的过程中,Facebook的工程师发现开发人员不应该先入为主的把数据看成RESTful一样的集合。如何更好地存储和获取数据不应该是他们要主要考虑的内容。他们应该更多的考虑数据的关系,网状的关系。

在这个情况下GraphQL应运而生。

 

2.3 GraphQL工作机制

       一个GraphQL查询可以包含一个或者多个操作(operation),类似于一个RESTful API。操作(operation)可以使两种类型:查询(Query)或者修改(mutation)。我们看一个例子:

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

       你的第一印象:“这个不是JSON?”。还真不是!就如我们之前说的,GraphQL设计的中心是为客户端服务。GraphQL的设计者希望可以写一个和期待的返回数据schema差不多的查询。

注意上面的例子有三个不同的部分组成:

(1)findById是查询的operation(这是一个Query)

(2)(id: 1) 包含了传入给Query的参数(多个参数,使用逗号隔开,比如:(id:1,name:”张三”) )

(3)查询包含id和name字段,这些字段也是我们希望查询可以返回的。(这里就是GraphQL的特性,能够指定要返回的字段,如果只指定了id,那么返回结果就只返回id。)

到这里是不是有点理解了GraphQL了,以前如果要返回不同的数据的话,需要编写多个接口,或者编写一个接口干脆什么字段都给返回给你,前端你自己就看着办吧,要显示哪些你就显示哪些,不要显示的,你就不要管了,4G时代,还什么流量问题,不用考虑。

我们看看server会给这个查询返回什么:

{
  "data": {
    "findById": {
      "id": "1",
      "name": "悟纤"
    }
  }
}

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

       从以上的例子里你可以看出来GraphQL允许客户端明确指定它要的是什么,避免了数据后去的冗余或者不足。和RESTful API对比一下,每一个客户端都会对应很多个RESTful API或者一个API要服务很多个客户端。所以说GraphQL是很好的查询语言。所有的operation、参数和所有可以查询的字段都需要在GraphQL server上定义、实现。

 

悟纤小结

悟纤:今天咱们就先探索到这里,知识需要慢慢消化,一口气不能吃个胖子。

(1)GraphQL(Grapha Query Language):主要是作用于数据接口,比如前端后端交互,给客户端筛选自由获取服务端事先定义好的数据,提高了交互接口的灵活性。

(2)GraphQL官方说:GraphQL一种为你的API而生的查询语言。

(3)API:应用编程接口,全称是Application Programming Interface。

(4)GraphQL简单理解:在请求API的时候,允许我们指定要返回的字段。

(5)GraphQL主要有两种操作(Operation):查询(Query)或者修改(mutation)。

       到此你是不是还是有点小蒙圈,没事,下节课我们会使用个小栗子来助你理解GraphQL。

       学习完本文之后,记住以下这句话就足以了:

GraphQL解决了接口查询字段差异性的要求。

 

我就是我,是颜色不一样的烟火。
我就是我,是与众不同的小苹果。

 

学院中有Spring Boot相关的课程:

à悟空学院:https://t.cn/Rg3fKJD

SpringBoot视频:http://t.cn/A6ZagYTi

Spring Cloud视频:http://t.cn/A6ZagxSR

SpringBoot Shiro视频:http://t.cn/A6Zag7IV

SpringBoot交流平台:https://t.cn/R3QDhU0

SpringData和JPA视频:http://t.cn/A6Zad1OH

SpringSecurity5.0视频:http://t.cn/A6ZadMBe

Sharding-JDBC分库分表实战:http://t.cn/A6ZarrqS

分布式事务解决方案「手写代码」:http://t.cn/A6ZaBnIr

你可能感兴趣的:(从零开始学Spring,Boot,spring,boot)