GraphQL的探索之路 – SpringBoot集成GraphQL小栗子篇二 - 第315篇
一、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的特性:想要什么, 就传入什么字段, 也就会返回什么字段。
购买完整视频,请前往:http://www.mark-to-win.com/TeacherV2.html?id=287