Java中GraphQL API简介
\n\nGraphQL是一种用于API的查询语言,它允许客户端只请求他们真正需要的数据。与响应结构固定的REST不同,GraphQL可以灵活地构建响应,从而显著减少传输的数据量并加快开发速度。
\n\n在本教程中,我们将实践如何使用graphql-java库和Spring Boot框架创建使用Java的GraphQL API。您将学习如何配置模式、编写解析器以及执行查询。
本文对于希望掌握构建API的现代方法并改善客户端与服务器之间交互的Java开发人员非常有用。
\n\n1. 项目配置与依赖项
\n\n首先,我们创建一个新的Spring Boot项目。最方便的方法是使用Spring Initializr。添加以下依赖项:
\n\n- \n
- Spring Web — 用于启动Web服务器 \n
- Spring Boot DevTools — 用于加速开发 \n
- Lombok — 用于减少样板代码 \n
创建项目后,将主要的GraphQL库添加到pom.xml中:
<dependency>\n <groupId>com.graphql-java</groupId>\n <artifactId>graphql-java-spring-boot-starter-webmvc</artifactId>\n <version>2021-06-30T00-00-00-1e4b5e5</version>\n</dependency>\n\n还需要一个用于GraphiQL工具(用于测试查询的Web界面)的库:
\n\n<dependency>\n <groupId>com.graphql-java</groupId>\n <artifactId>graphiql-spring-boot-starter</artifactId>\n <version>5.0.2</version>\n</dependency>\n\n添加依赖项后,更新项目并启动它。默认情况下,GraphiQL可通过地址http://localhost:8080/graphiql访问。
2. 创建数据模型和GraphQL模式
\n\n为了演示,我们创建一个简单的Book模型。定义一个包含id、title、author和pages字段的类。
import lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\n@Data\n@NoArgsConstructor\n@AllArgsConstructor\npublic class Book {\n private String id;\n private String title;\n private String author;\n private int pages;\n}\n\n现在需要定义GraphQL模式。在src/main/resources文件夹中创建文件schema.graphqls:
type Query {\n allBooks: [Book]\n bookById(id: String): Book\n}\n\ntype Book {\n id: String\n title: String\n author: String\n pages: Int\n}\n\n该模式描述了两种查询:获取所有书籍和根据ID获取书籍。Book类型包含四个字段。
\n\n为了处理查询,我们创建一个服务,该服务将数据存储在内存中(为简单起见):
\n\nimport org.springframework.stereotype.Service;\nimport javax.annotation.PostConstruct;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Optional;\n\n@Service\npublic class BookService {\n private List<Book> books = new ArrayList<>();\n\n @PostConstruct\n public void init() {\n books.add(new Book("1", "战争与和平", "列夫·托尔斯泰", 1225));\n books.add(new Book("2", "罪与罚", "费奥多尔·陀思妥耶夫斯基", 671));\n books.add(new Book("3", "大师与玛格丽特", "米哈伊尔·布尔加科夫", 480));\n }\n\n public List<Book> getAllBooks() {\n return books;\n }\n\n public Book getBookById(String id) {\n Optional<Boo