开始使用 GraphQL 和 Spring Boot

谈阎宝
2023-12-01

介绍:

GraphQL 是 API 的查询语言,也是对数据执行查询的运行时。它提供了一种比传统 REST API 更高效、更强大、更灵活的替代方案。在本教程中,我们将学习如何将 GraphQL 与 Spring Boot 集成并构建一个简单的应用程序。我们将使用 Java、Spring Boot 和 graphql-java 库来创建我们的应用程序。

先决条件:

在我们开始之前,请确保您的系统上安装了以下内容:

  • Java 开发工具包 (JDK) 8 或更高版本
  • Apache Maven
  • 您最喜欢的 IDE 或文本编辑器(例如,IntelliJ IDEA、Eclipse 或 Visual Studio Code)

设置项目:

首先,我们将使用 Spring Initializr Web 服务创建一个新的 Spring Boot 项目。打开终端并运行以下命令:

curl https://start.spring.io/starter.zip -o my-graphql-app.zip

解压缩下载的文件并将项目导入到您的 IDE 中。现在,将以下依赖项添加到您的pom.xml文件中:

<dependencies>
    ...
    <dependency>
        <groupId>com.graphql-java</groupId>
        <artifactId>graphql-java</artifactId>
        <version>17.3</version>
    </dependency>
    <dependency>
        <groupId>com.graphql-java-kickstart</groupId>
        <artifactId>graphql-spring-boot-starter</artifactId>
        <version>11.1.0</version>
    </dependency>
    <dependency>
        <groupId>com.graphql-java-kickstart</groupId>
        <artifactId>graphql-java-tools</artifactId>
        <version>11.0.1</version>
    </dependency>
    ...
</dependencies>

创建 GraphQL 架构:

创建一个新文件src/main/resources/graphql/schema.graphqls并定义您的 GraphQL 架构:

type Query {
    getAllBooks: [Book]
    getBook(id: ID!): Book
}

type Mutation {
    createBook(input: BookInput!): Book
}

type Book {
    id: ID!
    title: String!
    author: Author!
}

input BookInput {
    title: String!
    authorId: ID!
}

type Author {
    id: ID!
    name: String!
    books: [Book]
}

在这里,我们已经为我们的 API 定义了QueryMutation类型。我们还为数据模型定义了BookAuthor和类型。BookInput

构建数据模型:

Book接下来,创建 Java 类Book和Author

public class Book {
    private String id;
    private String title;
    private Author author;

    // Constructors, getters, and setters
}

public class Author {
    private String id;
    private String name;
    private List<Book> books;

    // Constructors, getters, and setters
}

实现 GraphQL 解析器:

创建一个Query类来实现查询解析器:

@Component
public class Mutation implements GraphQLMutationResolver {
    private final BookService bookService;

    public Mutation(BookService bookService) {
        this.bookService = bookService;
    }

    public Book createBook(BookInput input) {
        return bookService.createBook(input);
    }
}

现在,创建BookService类来处理业务逻辑

@Service
public class BookService {
    private final Map<String, Book> books = new HashMap<>();
    private final Map<String, Author> authors = new HashMap<>();

    public List<Book> getAllBooks() {
        return new ArrayList<>(books.values());
    }

    public Book getBook(String id) {
        return books.get(id);
    }

    public Book createBook(BookInput input) {
        String id = UUID.randomUUID().toString();
        Author author = authors.get(input.getAuthorId());
        if (author == null) {
            throw new RuntimeException("Author not found");
        }
        Book book = new Book(id, input.getTitle(), author);
        books.put(id, book);
        author.getBooks().add(book);
        return book;
    }
}

配置 GraphQL 服务器:

默认情况下,graphql-spring-boot-starter将自动为您配置 GraphQL 服务器。但是,您可以通过将以下属性添加到您的application.properties文件来自定义服务器设置:

graphql.servlet.corsEnabled=true
graphql.servlet.mapping=/graphql

此配置启用 CORS 并将 GraphQL 端点设置为/graphql.

测试 GraphQL API:

要测试 GraphQL API,请运行 Spring Boot 应用程序:

./mvnw spring-boot:run

打开您的浏览器并导航到位于 的 GraphQL Playground http://localhost:8080/graphql。您现在可以使用以下查询和变更来测试 API:

mutation createAuthor {
  createAuthor(input: { name: "Jane Austen" }) {createAuthor(input: { name: "Jane Austen" }) {
    id
    name
  }
}

mutation createBook {
  createBook(input: { title: "Pride and Prejudice", authorId: "1" }) {
    id
    title
    author {
      name
    }
  }
}

query getAllBooks {
  getAllBooks {
    id
    title
    author {
      name
    }
  }
}

query getBook {
  getBook(id: "1") {
    id
    title
    author {
      name
    }
  }
}

结论:

在本教程中,我们学习了如何使用 Spring Boot 和 graphql-java 库构建一个简单的 GraphQL API。我们涵盖了 GraphQL 模式设计、数据建模以及实现查询和变更解析器的基础知识。此处演示的示例项目可以作为使用 Spring Boot 构建更复杂的 GraphQL 应用程序的起点。

请记住,可以实施许多附加功能和优化,例如添加错误处理、缓存和更高级的查询功能。继续探索 GraphQL 生态系统以发现增强应用程序的新方法。

 类似资料: