使用Spring Boot来实现GraphQL
GraphQL是什么?
我希望您能参考REST的挑战和GraphQL。
环境
-
- Windows10
-
- Java8
-
- Spring Boot 2.2.1.RELEASE
- Maven 3.2.5
增加依赖库
我将添加以下内容。
-
- GraphQL Java
-
- GraphQL Spring Boot Starter
- GraphQL Java Tools
<!-- https://mvnrepository.com/artifact/com.graphql-java/graphql-java -->
<dependency>
<groupId>com.graphql-java</groupId>
<artifactId>graphql-java</artifactId>
<version>11.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.graphql-java/graphql-spring-boot-starter -->
<dependency>
<groupId>com.graphql-java</groupId>
<artifactId>graphql-spring-boot-starter</artifactId>
<version>5.0.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.graphql-java/graphql-java-tools -->
<dependency>
<groupId>com.graphql-java</groupId>
<artifactId>graphql-java-tools</artifactId>
<version>5.2.4</version>
</dependency>
我们使用的版本是截至2019年12月的最新版本。
Schema(ス
希望您能够参考GraphQL的模式和类型定义来了解有关模式和类型的内容。
type Book {
id: ID
name: String
pageCount: Int
author: Author
}
type Author {
id: ID
firstName: String
lastName: String
}
type Query {
bookById(id: ID): Book
}
创建Type类
根据模式定义创建一个与定义的类型相应的Java类(用于保存从某种数据源获取的数据)。
public class Book {
private String id;
private String name;
private int pageCount;
private Author author;
public void setId(String id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setPageCount(int pageCount) {
this.pageCount = pageCount;
}
public void setAuthor(Author author) {
this.author = author;
}
}
public class Author {
private String id;
private String firstName;
private String lastName;
public void setId(String id) {
this.id = id;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
创建解析器(Resolver)
正如我们在GraphQL的模式和类型定义中提到的那样,我们可以在模式定义中定义客户端可以操作的查询和各种类型。但是,模式只是定义,不会执行实际的数据操作。实际的数据操作是由解析器来完成的。
@Component
public class BookResolver implements GraphQLQueryResolver {
public Book bookById(String bookId) {
// 実際は何らかのデータストアからデータを読み込み返却するケースがほとんどだが、ここではダミー値を返却
Book book = new Book();
book.setId(bookId);
book.setName("bookName");
book.setPageCount(900);
Author author = new Author();
author.setId("0001");
author.setFirstName("fName");
author.setLastName("lName");
book.setAuthor(author);
return book;
}
}
执行
要执行GraphQL,可以使用GraphiQL和GraphQL Playground等工具,这些工具在介绍了GraphQL方便工具中提到过。本次使用的是GraphQL Playground的桌面版本。
*有关下载和安装,请参考GraphQL方便工具的说明。
启动Spring Boot后,打开安装的GraphQL Playground。选择“URL ENDPOINT”,输入http://localhost:8080/graphql并点击OPEN。在打开的界面上,写下以下查询,然后点击播放按钮进行执行。
query {
bookById(id:1) {
id
name
}
}
如果收到以下类似的回复,那就算是成功了。
{
"data": {
"bookById": {
"id": "1",
"name": "bookName"
}
}
}
让我们增加项目数量。现在,我们尝试编写以下查询,并点击播放按钮。
query {
bookById(id:1) {
id
name
author {
id
firstName
lastName
}
}
}
只要能够得到如下所示的响应就算成功了。这样可以在不改变源代码的情况下动态地更改所需获取的项目。
{
"data": {
"bookById": {
"id": "1",
"name": "bookName",
"author": {
"id": "0001",
"firstName": "fName",
"lastName": "lName"
}
}
}
}
就是这样了。
请参考
-
- https://www.graphql-java.com/documentation/master/
-
- https://www.graphql-java.com/tutorials/getting-started-with-spring-boot/
-
- https://techblog.yahoo.co.jp/advent-calendar-2018/create-springbook-graphql-api/
- https://github.com/graphql-java-kickstart/graphql-spring-boot#enable-graphql-servlet