相关历史文章(阅读本文之前,您可能需要先看下之前的系列)
国内最全的Spring Boot系列之三
「字节码插桩」统计方法耗时(第二篇:崭露头角)- 第311篇
「字节码插桩」统计方法耗时(第三篇:叱咤风云)- 第313篇
2020上半年发文汇总「值得收藏」
打破双亲委派【JVM:类加载机制深度剖析】 - 第9篇
GraphQL的探索之路 – 一种为你的API而生的查询语言 - 第314篇
悟纤:师傅,你看,我这两天研究了下GraphQL,现在可算是小有所成了。
师傅:来,那你给为师演示一下,看看怎么一个小有所成了。
师傅:Talk is cheap,showme the code.(废话少说,放码过来/别BB,看代码/口说无凭,代码为证/)
悟纤:师傅,你就睁大眼睛好好看看你聪明可爱的徒弟。卧薪尝胆这么久,是该一鸣惊人的时候了。
师傅:说再多没有用,为师已经不吃你这一套了,赶紧麻溜利索动起你的小手来。
悟纤:那你不要眨眼,我小手动起来,可就停不下来了。
一、GraphQL demo 说明
1.1 环境说明
OS : Mac
Spring Boot : 2.3.1.RELEASE
JDK: 1.8
graphql-spring-boot-starter : 5.0.2
graphql-java-tools:5.2.4
graphiql-spring-boot-starter:7.1.0
1.2 编码思路说明
(1)我们会新创建一个maven project;
(2)引入相关的依赖,比如spring boot和graphql的依赖包;
(3)编写相应的实体类以及服务(这里的demo简化了DAO的部分);
(4)定义GraphQLQueryResolver进行方法的声明;
(5)定义graphqls的接口定义和scheme定义。
二、GraphQL小栗子
2.1 新建一个Maven项目
使用IDE新建一个maven project,取名为:springboot-graphql-demo2020
2.2 引入相关依赖
在pom.xml文件添加依赖:
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.3.1.RELEASE
com.kfit
springboot-graphql-demo2020
0.0.1-SNAPSHOT
springboot-graphql-demo2020
Demo project for Spring Boot
1.8
org.springframework.boot
spring-boot-starter-web
com.graphql-java
graphql-spring-boot-starter
5.0.2
com.graphql-java
graphql-java-tools
5.2.4
com.graphql-java-kickstart
graphiql-spring-boot-starter
7.1.0
org.springframework.boot
spring-boot-maven-plugin
说明:
(1)graphql的依赖:graphql-spring-boot-starter、graphql-java-tools。
(2)graphiql(graphql GUI,图形化工具不是必需的):graphiql-spring-boot-starter;GraphiQL 是一个可以直接和 GraphQL 服务交互的 UI 界面,可以执行查询和修改请求。
2.3 编写实体类
这里我们编写一个作者的实体类Author:
package com.kfit.test.bean;
public class Author {
private int id;//作者的ID.
private String name;//作者名称.
private String photo;//照片.
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhoto() {
return photo;
}
public void setPhoto(String photo) {
this.photo = photo;
}
}
2.4 编写Service
我们需要有一个服务进行处理Author,这里我们省去DAO层,直接从service中进行构造数据,实际项目中service在调用dao即可:
package com.kfit.test.service;
import org.springframework.stereotype.Service;
import com.kfit.test.bean.Author;
@Service
public class AuthorService {
public Author findById(int id) {
Author author = new Author();
author.setId(id);
if(id==1) {
author.setName("悟纤");
author.setPhoto("/img/1.png");
}else if(id==2) {
author.setName("悟空");
author.setPhoto("/img/2.png");
}
return author;
}
}
2.5 编写GraphQLQueryResolver
GraphQL是通过实现GraphQLQueryResolver(空接口),在里面定义自己的方法处理数据,类似controller中的代码
package com.kfit.test.resolver;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.coxautodev.graphql.tools.GraphQLQueryResolver;
import com.kfit.test.bean.Author;
import com.kfit.test.service.AuthorService;
@Component
public class AuthorQuery implements GraphQLQueryResolver{
@Autowired
private AuthorService authorService;
public Author findAuthorById(int id) {
return authorService.findById(id);
}
}
我们发现这个类除了继承GraphQLQueryResolver之外,也没啥特殊的编码方式。
2.6 graphql服务定义和scheme定义
resources/graphql/root.graphqls : 一般会在root.graphqls文件中放Query或者Mutation的接口定义:
# 定义查询的方法
type Query {
findAuthorById(id: Long!):Author
}
这里定义了Query操作findAuthorById,这里对应的是
AuthorQuery.findAuthorById(int id)
另外如果在类型后面有!说明此参数/类型是非空的。
resources/graphql/schema.graphql:文件中定义type等数据对象:
type Author {
id: Int!
name: String
photo: String
}
这里定义了和实体类对应的数据类型Author。
2.7 SpringBoot启动类
代码自动生成的,可以跳过此步骤:
package com.kfit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringbootGraphqlDemo2020Application {
public static void main(String[] args) {
SpringApplication.run(SpringbootGraphqlDemo2020Application.class, args);
}
}
2.8 测试
运行启动类SpringbootGraphqlDemo2020Application,测试下访问如下地址:
http://127.0.0.1:8080/graphiql
就会看到一个友好的界面:
根据GraphQL的语法进行调用下我们的API吧:
在左边的界面中输入如下的语法:
query{
findAuthorById(id:1){
id,
name,
photo
}
}
然后点击执行Execute Query按钮,可以在右边看到返回的数据 :
三、GraphQL特性理解
3.1 特性验证
我们在前面文章中说到GraphQL的一个特点是:想要什么, 就传入什么字段, 也就会返回什么字段。
我们可以修改GraphQL语句,在执行以下:
query{
findById(id:1){
id,
name
}
}
那么执行的结果就是:
后端代码无需做任何调整,是不是爽的一匹。
3.2 !非空验证
我们在前面说明了!字段字段非空的意思,那么如果我们在执行的时候,不传递参数的话,是否会报错呢?答案是会的:
四、悟纤小结
悟纤:好了,咱们就先暂时探索到这里吧,想必你还有一些疑问,我们下节会解答一部分大家的疑问,简单总结下吧。
(1)GraphQL的例子步骤:添加相关依赖、编写Query实现、定义.graphqls配置文件。
(2)Graphiql:GraphQL GUI,通过图形化界面,可以发起graphql语句执行,返回结果。
(3)理解GraphQL的特性:想要什么, 就传入什么字段, 也就会返回什么字段。
下节预告
Q1:对于GraphQL使用curl如何发送请求?
Q2:是否可以建立多个.graphql文件进行管理呐?
Q3:合并查询、复杂查询你懂么?
我就是我,是颜色不一样的烟火。
我就是我,是与众不同的小苹果。
学院中有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