天天看點

Springboot整合GraphQL使你的API更易了解可讀性更強

作者:Spring全家桶實戰案例

環境:Springboot3.0.9

概述

  • 一種用于 API 的查詢語言

GraphQL 既是一種用于 API 的查詢語言也是一個滿足你資料查詢的運作時。 GraphQL 對你的 API 中的資料提供了一套易于了解的完整描述,使得用戶端能夠準确地獲得它需要的資料,而且沒有任何備援,也讓 API 更容易地随着時間推移而演進,還能用于建構強大的開發者工具。

  • 請求你所要的資料

向你的 API 發出一個 GraphQL 請求就能準确獲得你想要的資料,不多不少。 GraphQL 查詢總是傳回可預測的結果。使用 GraphQL 的應用可以工作得又快又穩,因為控制資料的是應用,而不是伺服器。

  • 擷取多個資源

GraphQL 查詢不僅能夠獲得資源的屬性,還能沿着資源間引用進一步查詢。典型的 REST API 請求多個資源時得載入多個 URL,而 GraphQL 可以通過一次請求就擷取你應用所需的所有資料。這樣一來,即使是比較慢的移動網絡連接配接下,使用 GraphQL 的應用也能表現得足夠迅速。

  • 描述所有的可能

GraphQL API 基于類型和字段的方式進行組織,而非入口端點。你可以通過一個單一入口端點得到你所有的資料能力。GraphQL 使用類型來保證應用隻請求可能的資料,還提供了清晰的輔助性錯誤資訊。應用可以使用類型,而避免編寫手動解析代碼。

有關GraphQL的文法相關知識,請參考

https://graphql.org/

中文

https://graphql.cn/

接下來将以一個完整的示例示範GraphQL的使用。

環境配置

  • 引入依賴
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-graphql</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
  <groupId>com.mysql</groupId>
  <artifactId>mysql-connector-j</artifactId>
  <scope>runtime</scope>
</dependency>           
  • 配置檔案
spring:
  datasource:
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/testjpa?serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&useSSL=false
    username: root
    password: xxxxxx
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      minimumIdle: 10
      maximumPoolSize: 200
      autoCommit: true
      idleTimeout: 30000
      poolName: MasterDatabookHikariCP
      maxLifetime: 1800000
      connectionTimeout: 30000
      connectionTestQuery: SELECT 1  
---
spring:
  jpa:
    generateDdl: false
    hibernate:
      ddlAuto: update
    openInView: true
    show-sql: true
---
spring:
  graphql:
    path: /graphql
    graphiql:
      enabled: true
      path: /graphiql
    cors:
      allow-credentials: true
      allowed-headers: '*'
      allowed-methods: '*'
    schema:
      locations:
      - classpath*:graphql/**/
      file-extensions:
      - .graphqls
      - .gqls
      printer:
        enabled: true           

注意:這裡的spring.graphql.graphql.enabled=true開啟後,将會提供一個UI界面供我們快速查詢測試使用

Springboot整合GraphQL使你的API更易了解可讀性更強

做好以上配置後,接下來就是建立2張表t_book和t_author。

實體定義

Book

@Entity
@Table(name = "t_book")
public class Book {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id ;
  private String name ;
  private Integer pageCount ;
  @Transient
  private List<Author> author = new ArrayList<>();
}           

Author

@Entity
@Table(name = "t_author")
public class Author {
  
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id ;
  private String firstName ;
  private String lastName ;
  // Book表的主鍵
  private Long bid ;
}           

Repository定義

BookRepository

public interface BookRepository extends JpaRepository<Book, Long>, JpaSpecificationExecutor<Book> {
}           

AuthorRepository

public interface AuthorRepository extends JpaRepository<Author, Long>, JpaSpecificationExecutor<Author> {

  List<Author> findByBid(Long bid) ;
  
}           

Service定義

@Service
public class BookService {
  
  @Resource
  private BookRepository bookRepository ;
  @Resource
  private AuthorRepository authorRepository ;
  
  public Book queryBook(Long id) {
    Book book = bookRepository.findById(id).orElse(null) ;
    List<Author> authors = authorRepository.findByBid(id) ;
    book.setAuthor(authors) ;
    return book ;
  }
  
}           

以上是基本的資料庫操作,很容易了解。接下來就是定義GraphQL Schema

GraphQL Schema定義

schema {
  query: BookQuery
}

type BookQuery {
  bookById(id: ID): Book
}

type Book {
  id: ID
  name: String
  pageCount: Int
  author: [Author]
}

type Author {
  id: ID
  firstName: String
  lastName: String
}           

有關graphql相關文法請參考上面提到的網址。接下來是定義通路接口

Controller接口

@Controller
public class BookController {

  @Resource
  private BookService bookService;
  @Resource
  private AuthorRepository authorRepository;

  @SchemaMapping(typeName = "BookQuery", field = "bookById")
  public Book bookById(@Argument Long id) {
    return bookService.queryBook(id);
  }

}           

通路測試

隻需通路統一的入口即可:

#該通路路徑可以在配置檔案中修改

http://localhost:8080/graphql

Springboot整合GraphQL使你的API更易了解可讀性更強

這裡是通路的完整的資訊,我們可以在請求的query中設定需要通路的字段,如下:

Springboot整合GraphQL使你的API更易了解可讀性更強

隻通路book資訊

Springboot整合GraphQL使你的API更易了解可讀性更強

隻通路部分字段資訊

你需要通路那些字段,是完全由用戶端定義的。

完畢!!!

轉發+關注

SpringBoot對Spring MVC都做了哪些事?(一)

SpringBoot對Spring MVC都做了哪些事?(二)

SpringBoot對Spring MVC都做了哪些事?(三)

SpringBoot對Spring MVC都做了哪些事?(四)

Spring Retry重試架構的應用

Spring強大的任務執行與排程

Spring容器這些擴充點你都清楚了嗎?

Spring MVC 異步請求方式 Spring事務管理器詳解

Springboot整合GraphQL使你的API更易了解可讀性更強
Springboot整合GraphQL使你的API更易了解可讀性更強