GraphQL API 与 Java:面向初学者的分步教程

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

GraphQL 和 Java 简介

GraphQL 是一种由 Facebook 开发的现代 API 查询语言。与 REST 不同,REST 的每个端点返回固定的数据结构,而 GraphQL 允许客户端精确请求所需的字段。这减少了传输的数据量,并简化了复杂接口的开发。

在本教程中,我们将使用 Spring Boot 和 graphql-java 库创建一个简单的 Java GraphQL API。您将学习如何配置项目、定义 schema、实现解析器以及测试 API。本文面向初学者,因此我们将逐步进行。

您需要准备:JDK 11+、Maven 或 Gradle、IDE(IntelliJ IDEA、Eclipse)以及 Java 基础知识。



1. 配置 Spring Boot 项目

首先创建一个新的 Spring Boot 项目。最简单的方法是使用 Spring Initializr。选择以下依赖项:

  • Spring Web
  • Spring Boot DevTools
  • Lombok(可选,用于简化代码)

生成项目后,在 pom.xml(或 build.gradle)中添加 GraphQL 依赖项:

<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>

这些库将简化 GraphQL 与 Spring Boot 的集成。更新依赖项后,使用命令 mvn spring-boot:run 或通过 IDE 启动项目。



2. 定义 GraphQL Schema

Schema 是 GraphQL API 的基础。它描述了数据类型、查询(queries)和变更(mutations)。在 src/main/resources 文件夹中创建文件 schema.graphqls:

type Book {    id: ID!    title: String!    author: String!    year: Int}

type Query { books: [Book] bookById(id: ID!): Book}

type Mutation { addBook(title: String!, author: String!, year: Int): Book}

这里我们定义了 Book 类型,包含必填字段 id、title、author 和可选字段 year。Query 包含两个查询:获取所有书籍和按 ID 获取书籍。Mutation 允许添加新书籍。

注意感叹号——它表示必填字段(non-null)。



3. 实现解析器

解析器(resolvers)是将 schema 与数据关联起来的 Java 类。让我们创建 Book 类作为数据模型:

import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;

@Data@NoArgsConstructor@AllArgsConstructorpublic class Book { private String id; private String title; private String author; private Integer year;}

现在创建一个用于存储书籍的服务(在实际项目中,这里将连接数据库):

import org.springframework.stereotype.Service;import javax.annotation.PostConstruct;import java.util.ArrayList;import java.util.List;import java.util.Optional;import java.util.UUID;

@Servicepublic class BookService { private List<Book> books = new ArrayList<>();

@PostConstruct public void init() { books.add(new Book("1", "战争与和平", "列夫·托尔斯泰", 1869)); books.add(new Book("2", "罪与罚", "费奥多尔·陀思妥耶夫斯基", 1866)); }

public List<Book> getAllBooks() { return books; }

public Optional<Book> getBookById(String id) { return books.str

博客

书籍推荐