📫 作者简介:「六月暴雪飞梨花」,专注于研究Java,就职于科技型公司后端工程师
🏆 近期荣誉:华为云云享专家、阿里云专家博主、腾讯云优秀创作者、腾讯云TDP-KOL、ACDU成员、墨天轮技术专家博主
🔥 三连支持:欢迎 ❤️关注、👍点赞、👉收藏三连,支持一下博主~
引言
上一篇熟悉了API架构风格GraphQL API和RESTful API,这一篇结合Spring集成GraphQL来实践下,深度剖析下。上一篇的链接:《开发实践|API新宠GraphQL浅谈》。
前期准备
** 开发工具** :IDEA(或者VS code都是可以的)、Postman、浏览器。
** 运行环境** :如果需要执行GraphQL,JDK的版本必须为 JDK 17+
。
** 仓库管理** :Gradle 7.5+ or Maven 3.5+ 。
如何构建GraphQL
大多数Spring入门指南一样,可以从头开始并完成每个步骤,或者您可以绕过您已经熟悉的基本设置步骤。无论哪种方式,您最终都会获得工作代码。
● 使用Git工具,在Github克隆示例源代码。
● 在Spring.io ,使用 Spring Initializr 方式创建一份源代码。
创建GraphQL集成环境
而我本人更建议学习GraphQL的可以从 Spring Initializr 方式自己创建并下载源代码,下面从 9个步骤 来创建一个GraphQL集成程序。
首先直接访问地址获取配置信息,https://start.spring.io/,请求地址后如下图所示,并按照自己的风格填写信息。
● 步骤1:选择项目,当前项目为maven项目,在GraphQL中如果使用Github下载,默认为Gradle管理依赖库,我习惯maven,所以此处选择maven。
● 步骤2:选择语言,我熟练Java,所以此处选择Java。如果你熟悉Kotlin或Groovy,也可以选择他们。
● 步骤3:选择合适的Spring Boot版本,GraphQL默认支持的最好选择新版本,因为在GraphQL支持的Java运行环境都要Java 17+。
● 步骤4:填写项目信息,这里就随意填写了。
● 步骤5:选择Spring Boot的jar包项目,可直接运行访问。
● 步骤6:选择Java运行环境,最低为 17+。
● 步骤7:点击 【ADD DEPENDENCIES】从中选择需要的依赖库,主要有 Spring for GraphQL 和 Spring Web依赖。
● 步骤8:当一切都填写完成和选择完成后,选择自动生成代码,此时会按照选择,自动下载代码,代码为.zip的压缩包,需要解压到磁盘的某一处即可。
● 步骤9:此步骤就是在IDEA中导入上面步骤8的项目代码。
IDEA打开GraphQL项目
将代码导入到项目中就是下面的结构。可以看到生成的代码如下:
IDEA中安装支持插件
可以提前在插件中搜索插件,也可以创建项目文件后根据需要下载安装插件。
1 Lombok插件
如果你机器已经安装了这个插件,可以忽略。
2 支持Schema模型文件的插件
支持GraphQL的模型文件的后缀名太长,我是记不住—— graphqls,直接安装这个插件就行了,官方提供的。
3 Spring 支持的GraphQL插件
GraphQL代码示例
1 拷贝官网提供的代码
当前为了方便演示,直接从官网下载代码。下载地址为:
https://github.com/spring-guides/gs-graphql-server/tree/main/complete
将 标注的 1处 和 2处 的文件直接拷贝到项目的对应目录中即可。拷贝后的代码结构如下:
2 拷贝文件说明
我们从官网拷贝了4个文件,分别是 Author.java、Book.java、BookController.java、schema.graphqls 。
● Book.java:书籍关系对象,定义书籍实体类以及书籍需要的方法。
public record Book (String id, String name, int pageCount, String authorId) {
private static List<Book> books = Arrays.asList(
new Book("book-1", "Effective Java", 416, "author-1"),
new Book("book-2", "Hitchhiker's Guide to the Galaxy", 208, "author-2"),
new Book("book-3", "Down Under", 436, "author-3")
);
public static Book getById(String id) {
return books.stream()
.filter(book -> book.id.equals(id))
.findFirst()
.orElse(null);
}
}
● Author.java:作者关系对象,定义书籍作者实体类以及或者作者信息需要的方法。
● BookController.java:控制器,类似RESTful中的controller控制器类功能一样,但有几处不一样。
○ @QueryMapping:查询映射器,例如控制器中的方法为 bookById 需要的参数为 字符串的 id,返回的类型为 Book。
○ @SchemaMapping:实例关系模型映射器。
○ @Argument:接口需要的参数标识。
@Controller
public class BookController {
@QueryMapping
public Book bookById(@Argument String id) {
return Book.getById(id);
}
@SchemaMapping
public Author author(Book book) {
return Author.getById(book.authorId());
}
}
● schema.graphqls:最重要的文件,模型映射关系文件。
○ 此文件定义了一个方法,名称为Query的方法,方法名称为bookById,返回值为Book。
○ 对象Book类型为书籍模型信息,其中author为作者对象。
○ 作者Author对象为作者信息,Book对象与Author对象的关联来自上述的 @SchemaMapping注解,可以理解这里是自动获取信息,有些类似我们的下拉列表那种及联获取信息。
type Query {
bookById(id: ID): Book
}
type Book {
id: ID
name: String
pageCount: Int
author: Author
}
type Author {
id: ID
firstName: String
lastName: String
}
3 开启UI可视化调试页面
到此,便完成了一个功能的代码编制。如果需要使用GraphQL自带的控制台(UI可视化视图)来测试代码功能,可以在项目的配置文件 application.properties 中增加开启视图即可,默认是false,为关闭状态。
spring.graphql.graphiql.enabled=true
启动GraphQL
按照启动Spring Boot项目的方式,直接运行 XXXApplication主文件即可启动项目,默认的端口为 8080,默认项目地址为 / ,端点请求地址为 HTTP POST /graphql。
由于我们在 配置文件开启了 UI 视图,可以直接访问地址
http://localhost:8080/graphiql?path=/graphql
测试GraphQL
1 UI可视化请求信息
在UI可视化控制台输入查询信息,点击按钮,可以在右侧看到返回的JSON信息。
这里是有提示的,给我的感觉就是服务端将数据全部暴露出来,客户端可以控制请求参数以及返回信息。下面再展示几个:
2 Postman请求信息
由于GraphQL都是使用HTTP的Post方式请求的,所以在Postman中输入地址,然后选择GraphQL方式,按照GraphQL参数方式输入,然后点击 Send 即可看到从服务器返回的数据。
总结
本文主要是从官方案例中使用Spring集成GraphQL,从代码上、代码编写上、启动、测试等,浅谈下GraphQL的运用,不过个人感觉有点一反常态,写习惯了RESTful之后,再来学习GraphQL,的确有些不适应,但是未来在短视频、大流量的加持下,会好的,希望能给更多开发者以帮助。
[引用]
- 构建GraphQL服务:https://spring.io/guides/gs/graphql-server#initial
- https://spring.io/guides/gs/graphql-server
- https://start.spring.io/
- https://spring.io/projects/spring-graphql#overview
欢迎关注博主 「六月暴雪飞梨花」 或加入【六月暴雪飞梨花社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。