使用Spring Boot和GraphQL構建靈活的API服務

省赚客开发者团队發表於2024-07-17

使用Spring Boot和GraphQL構建靈活的API服務

大家好,我是微賺淘客系統3.0的小編,是個冬天不穿秋褲,天冷也要風度的程式猿!

一、引言

在現代Web應用中,API服務是前後端資料互動的橋樑。傳統的RESTful API雖然強大,但在複雜查詢場景中顯得有些笨重。GraphQL作為一種新型API查詢語言,提供了更靈活和高效的查詢方式。本文將詳細介紹如何使用Spring Boot和GraphQL構建靈活的API服務。

二、環境搭建

首先,建立一個新的Spring Boot專案,並新增必要的依賴。我們將使用GraphQL Java和Spring Boot Starter GraphQL來實現GraphQL API。

  1. 新增Maven依賴

pom.xml中新增以下依賴:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </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>graphiql-spring-boot-starter</artifactId>
        <version>11.1.0</version>
    </dependency>
    <dependency>
        <groupId>com.graphql-java-kickstart</groupId>
        <artifactId>graphql-java-tools</artifactId>
        <version>11.1.0</version>
    </dependency>
</dependencies>

三、定義GraphQL Schema

GraphQL Schema定義了API的查詢和型別。我們在src/main/resources目錄下建立一個schema.graphqls檔案。

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

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

四、建立實體類

cn.juwatech.model包下建立一個Book類。

package cn.juwatech.model;

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

    // Getters and Setters
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getPublishedDate() {
        return publishedDate;
    }

    public void setPublishedDate(String publishedDate) {
        this.publishedDate = publishedDate;
    }
}

五、資料儲存

cn.juwatech.repository包下建立一個簡單的BookRepository類來模擬資料儲存。

package cn.juwatech.repository;

import cn.juwatech.model.Book;
import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

@Repository
public class BookRepository {
    private List<Book> books = new ArrayList<>();

    public BookRepository() {
        books.add(new Book("1", "Spring Boot in Action", "Craig Walls", "2016"));
        books.add(new Book("2", "GraphQL in Action", "Samer Buna", "2021"));
    }

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

    public Optional<Book> getBookById(String id) {
        return books.stream().filter(book -> book.getId().equals(id)).findFirst();
    }
}

六、建立GraphQL查詢

cn.juwatech.resolver包下建立一個BookQuery類。

package cn.juwatech.resolver;

import cn.juwatech.model.Book;
import cn.juwatech.repository.BookRepository;
import com.coxautodev.graphql.tools.GraphQLQueryResolver;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
public class BookQuery implements GraphQLQueryResolver {

    @Autowired
    private BookRepository bookRepository;

    public Book getBookById(String id) {
        return bookRepository.getBookById(id).orElse(null);
    }

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

七、啟動應用並測試

透過執行Spring Boot應用程式,我們可以啟動GraphQL API服務。訪問http://localhost:8080/graphiql,可以使用GraphiQL工具來測試我們的API。

查詢示例

獲取所有書籍:

query {
  getAllBooks {
    id
    title
    author
    publishedDate
  }
}

根據ID獲取書籍:

query {
  getBookById(id: "1") {
    id
    title
    author
    publishedDate
  }
}

八、處理複雜查詢

GraphQL允許我們處理複雜查詢。例如,我們可以新增一個新欄位來查詢作者的書籍。

  1. 更新Schema

schema.graphqls中新增新欄位:

type Query {
    getBookById(id: ID!): Book
    getAllBooks: [Book]
    getBooksByAuthor(author: String!): [Book]
}
  1. 更新Resolver

BookQuery中新增新方法:

package cn.juwatech.resolver;

import cn.juwatech.model.Book;
import cn.juwatech.repository.BookRepository;
import com.coxautodev.graphql.tools.GraphQLQueryResolver;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.stream.Collectors;

@Component
public class BookQuery implements GraphQLQueryResolver {

    @Autowired
    private BookRepository bookRepository;

    public Book getBookById(String id) {
        return bookRepository.getBookById(id).orElse(null);
    }

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

    public List<Book> getBooksByAuthor(String author) {
        return bookRepository.getAllBooks().stream()
                .filter(book -> book.getAuthor().equalsIgnoreCase(author))
                .collect(Collectors.toList());
    }
}

九、最佳化與安全

為了確保我們的GraphQL API的安全性和效能,我們可以採取以下措施:

  1. 分頁查詢:對於大量資料的查詢,使用分頁技術來減少資料傳輸量。
  2. 資料驗證:在解析器中進行資料驗證,確保輸入資料的合法性。
  3. 許可權控制:使用Spring Security來保護GraphQL API,確保只有授權使用者可以訪問特定的資料。

十、總結

本文詳細介紹瞭如何使用Spring Boot和GraphQL構建靈活的API服務。從環境搭建到Schema定義,從資料儲存到查詢實現,我們逐步構建了一個功能完善的GraphQL API,並展示瞭如何處理複雜查詢和最佳化API。

本文著作權歸聚娃科技微賺淘客系統開發者團隊,轉載請註明出處!

相關文章