GraphQL的探索之路 – SpringBoot集成GraphQL小栗子篇二 - 第315篇

GraphQL的探索之路 – SpringBoot集成GraphQL小栗子篇二 - 第315篇_第1张图片

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

国内最全的Spring Boot系列之三

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

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

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

打破双亲委派【JVM:类加载机制深度剖析】 - 第9篇

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

 

悟纤:师傅,你看,我这两天研究了下GraphQL,现在可算是小有所成了。

 

GraphQL的探索之路 – SpringBoot集成GraphQL小栗子篇二 - 第315篇_第2张图片

师傅:来,那你给为师演示一下,看看怎么一个小有所成了。

师傅:Talk is cheap,showme the code.(废话少说,放码过来/别BB,看代码/口说无凭,代码为证/)

 

GraphQL的探索之路 – SpringBoot集成GraphQL小栗子篇二 - 第315篇_第3张图片

悟纤:师傅,你就睁大眼睛好好看看你聪明可爱的徒弟。卧薪尝胆这么久,是该一鸣惊人的时候了。

GraphQL的探索之路 – SpringBoot集成GraphQL小栗子篇二 - 第315篇_第4张图片

师傅:说再多没有用,为师已经不吃你这一套了,赶紧麻溜利索动起你的小手来。

悟纤:那你不要眨眼,我小手动起来,可就停不下来了。

GraphQL的探索之路 – SpringBoot集成GraphQL小栗子篇二 - 第315篇_第5张图片

 

一、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的探索之路 – SpringBoot集成GraphQL小栗子篇二 - 第315篇_第6张图片

       根据GraphQL的语法进行调用下我们的API吧:

在左边的界面中输入如下的语法:

query{
  findAuthorById(id:1){
    id,
    name,
    photo
  }
}

然后点击执行Execute Query按钮,可以在右边看到返回的数据 :

GraphQL的探索之路 – SpringBoot集成GraphQL小栗子篇二 - 第315篇_第7张图片

三、GraphQL特性理解

3.1 特性验证

我们在前面文章中说到GraphQL的一个特点是:想要什么, 就传入什么字段, 也就会返回什么字段

       我们可以修改GraphQL语句,在执行以下:

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

       那么执行的结果就是:

GraphQL的探索之路 – SpringBoot集成GraphQL小栗子篇二 - 第315篇_第8张图片

后端代码无需做任何调整,是不是爽的一匹。

 

3.2 !非空验证

       我们在前面说明了!字段字段非空的意思,那么如果我们在执行的时候,不传递参数的话,是否会报错呢?答案是会的:

GraphQL的探索之路 – SpringBoot集成GraphQL小栗子篇二 - 第315篇_第9张图片

四、悟纤小结

悟纤:好了,咱们就先暂时探索到这里吧,想必你还有一些疑问,我们下节会解答一部分大家的疑问,简单总结下吧。

(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

 

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