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

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

国内最全的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文件添加依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.3.1.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.kfit</groupId>
	<artifactId>springboot-graphql-demo2020</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>springboot-graphql-demo2020</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
		    <groupId>com.graphql-java</groupId>
		    <artifactId>graphql-spring-boot-starter</artifactId>
		    <version>5.0.2</version>
		</dependency>	
		<dependency>
		    <groupId>com.graphql-java</groupId>
		    <artifactId>graphql-java-tools</artifactId>
		    <version>5.2.4</version>
		</dependency>
		<dependency>
		    <groupId>com.graphql-java-kickstart</groupId>
		    <artifactId>graphiql-spring-boot-starter</artifactId>
		    <version>7.1.0</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

说明:

(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

 

悟纤 CSDN认证博客专家 知远公司创始人 架构师 访问1000万+
「公众号SpringBoot」:
①阿里巴巴前高级研发工程师;②估值20亿美金的Blued架构师;③北京知远公司创始人;④浙江甄才公司架构师;⑤云课堂学员10000+;⑥博客访问量1000万+;⑦10年互联网行业从业;⑧340万的访问《从零开始学SprngBoot》作者;⑨技术加盟多个独立项目。
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页
实付 19.89元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值