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文件添加依赖:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.3.1.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.kfit</groupId>
  12. <artifactId>springboot-graphql-demo2020</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>springboot-graphql-demo2020</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. </properties>
  19. <dependencies>
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-starter-web</artifactId>
  23. </dependency>
  24. <dependency>
  25. <groupId>com.graphql-java</groupId>
  26. <artifactId>graphql-spring-boot-starter</artifactId>
  27. <version>5.0.2</version>
  28. </dependency>
  29. <dependency>
  30. <groupId>com.graphql-java</groupId>
  31. <artifactId>graphql-java-tools</artifactId>
  32. <version>5.2.4</version>
  33. </dependency>
  34. <dependency>
  35. <groupId>com.graphql-java-kickstart</groupId>
  36. <artifactId>graphiql-spring-boot-starter</artifactId>
  37. <version>7.1.0</version>
  38. </dependency>
  39. </dependencies>
  40. <build>
  41. <plugins>
  42. <plugin>
  43. <groupId>org.springframework.boot</groupId>
  44. <artifactId>spring-boot-maven-plugin</artifactId>
  45. </plugin>
  46. </plugins>
  47. </build>
  48. </project>

说明:

(1)graphql的依赖:graphql-spring-boot-starter、graphql-java-tools。

(2)graphiql(graphql GUI,图形化工具不是必需的):graphiql-spring-boot-starter;GraphiQL 是一个可以直接和 GraphQL 服务交互的 UI 界面,可以执行查询和修改请求。

2.3 编写实体类

       这里我们编写一个作者的实体类Author:

  1. package com.kfit.test.bean;
  2. public class Author {
  3. private int id;//作者的ID.
  4. private String name;//作者名称.
  5. private String photo;//照片.
  6. public int getId() {
  7. return id;
  8. }
  9. public void setId(int id) {
  10. this.id = id;
  11. }
  12. public String getName() {
  13. return name;
  14. }
  15. public void setName(String name) {
  16. this.name = name;
  17. }
  18. public String getPhoto() {
  19. return photo;
  20. }
  21. public void setPhoto(String photo) {
  22. this.photo = photo;
  23. }
  24. }

2.4 编写Service

       我们需要有一个服务进行处理Author,这里我们省去DAO层,直接从service中进行构造数据,实际项目中service在调用dao即可:

  1. package com.kfit.test.service;
  2. import org.springframework.stereotype.Service;
  3. import com.kfit.test.bean.Author;
  4. @Service
  5. public class AuthorService {
  6. public Author findById(int id) {
  7. Author author = new Author();
  8. author.setId(id);
  9. if(id==1) {
  10. author.setName("悟纤");
  11. author.setPhoto("/img/1.png");
  12. }else if(id==2) {
  13. author.setName("悟空");
  14. author.setPhoto("/img/2.png");
  15. }
  16. return author;
  17. }
  18. }

2.5 编写GraphQLQueryResolver

       GraphQL是通过实现GraphQLQueryResolver(空接口),在里面定义自己的方法处理数据,类似controller中的代码

  1. package com.kfit.test.resolver;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.stereotype.Component;
  4. import com.coxautodev.graphql.tools.GraphQLQueryResolver;
  5. import com.kfit.test.bean.Author;
  6. import com.kfit.test.service.AuthorService;
  7. @Component
  8. public class AuthorQuery implements GraphQLQueryResolver{
  9. @Autowired
  10. private AuthorService authorService;
  11. public Author findAuthorById(int id) {
  12. return authorService.findById(id);
  13. }
  14. }

       我们发现这个类除了继承GraphQLQueryResolver之外,也没啥特殊的编码方式。

 



2.6 graphql服务定义和scheme定义

resources/graphql/root.graphqls : 一般会在root.graphqls文件中放Query或者Mutation的接口定义:

  1. # 定义查询的方法
  2. type Query {
  3. findAuthorById(id: Long!):Author
  4. }

这里定义了Query操作findAuthorById,这里对应的是

AuthorQuery.findAuthorById(int id)

       另外如果在类型后面有!说明此参数/类型是非空的

 

resources/graphql/schema.graphql:文件中定义type等数据对象:

  1. type Author {
  2. id: Int!
  3. name: String
  4. photo: String
  5. }

这里定义了和实体类对应的数据类型Author。

 

2.7 SpringBoot启动类

       代码自动生成的,可以跳过此步骤:

  1. package com.kfit;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class SpringbootGraphqlDemo2020Application {
  6. public static void main(String[] args) {
  7. SpringApplication.run(SpringbootGraphqlDemo2020Application.class, args);
  8. }
  9. }

2.8 测试

       运行启动类SpringbootGraphqlDemo2020Application,测试下访问如下地址:

http://127.0.0.1:8080/graphiql

       就会看到一个友好的界面:

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

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

  1. query{
  2. findAuthorById(id:1){
  3. id,
  4. name,
  5. photo
  6. }
  7. }

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

三、GraphQL特性理解

3.1 特性验证

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

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

  1. query{
  2. findById(id:1){
  3. id,
  4. name
  5. }
  6. }

       那么执行的结果就是:

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

 

3.2 !非空验证

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

四、悟纤小结

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

(1)GraphQL的例子步骤:添加相关依赖、编写Query实现、定义.graphqls配置文件。

(2)Graphiql:GraphQL GUI,通过图形化界面,可以发起graphql语句执行,返回结果。

(3)理解GraphQL的特性:想要什么, 就传入什么字段, 也就会返回什么字段。

 


购买完整视频,请前往:http://www.mark-to-win.com/TeacherV2.html?id=287