首頁  >  文章  >  Java  >  SpringBoot怎麼使用GraphQL開發Web API

SpringBoot怎麼使用GraphQL開發Web API

PHPz
PHPz轉載
2023-05-13 10:52:051535瀏覽

前言

傳統的Restful API 存在諸多的問題,首先它無法控制返回的字段,前端也無法預判後端的返回結果,另外不同的返回結果對應不同的請求地址,這就導致了多次請求的問題。而GraphQL正是基於這樣的背景而建構出來的API查詢語言,相對於傳統Restful API 它具有以下幾個優點:

  • 靈活性:GraphQL 可以根據客戶端的需求靈活地查詢數據,而不是像RESTful API 那樣傳回固定結構的資料。

  • 減少網路請求:GraphQL 允許客戶端在一次請求中取得多個資源,這有助於減少網路請求的數量並提高效能。

  • 強型別:GraphQL 有一個強型別系統,客戶端可以在編譯時偵測到查詢中的錯誤,這有助於減少執行時間錯誤。

  • 可快取:GraphQL 具有可快取性,這意味著伺服器可以快取查詢的結果,從而提高效能和可擴展性。

  • 文件化:GraphQL 具有自我文件化的能力,使得開發者可以快速了解 API 的結構和功能。

Spring Boot中GraphQL的實作方案

如果後端語言為Java,那麼GraphQL Java就是實作GraphQL的基礎函式庫。另外Spring已經整合了GraphQL,如果專案中使用了Spring,那麼就更推薦Spring GraphQL。

Spring GraphQL的開發總體分為以下幾個步驟

新增 Spring GraphQL 依賴項

在您的專案中新增 Spring GraphQL 依賴項。您可以透過 Maven 或 Gradle 等建置工具來新增依賴項。例如,如果您使用 Maven,則可以新增下列相依性

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-graphql</artifactId>
        </dependency>

定義 GraphQL Schema

在您的應用程式中定義 GraphQL Schema。 Schema 定義了可查詢的類型和欄位。您可以使用 SDL(Schema Definition Language)或程式設計方式定義 Schema。

對於Spring Boot 工程來說schema檔案放到resources/graphql/目錄下,檔案名稱後綴graphqls,下面是我定義一個的簡單的schema.graphqls。

它指定了兩個查詢實現,author(id:Int)表示透過id查詢Author,allAuthors則表示查詢Author數組。

schema {
    query: Query
}

type Query {
    author(id:Int): Author
    allAuthors: [Author]
}

type Author {
    id:Int
    firstName:String
    lastName:String
    email:String
    birthdate:
    email:String

    birthdate:
}

##}

##實作RuntimeWiringConfigurer

RuntimeWiringConfigurer是實現GraphQL取得資料的核心,使用GraphQL並不能直接去掉Mybatis/Jpa這類持久層框架,從資料庫取得資料仍需要這類框架的支援。

而RuntimeWiringConfigurer則類似於Spring中的service層,它是實現基礎資料的核心。

以下是一個簡單範例:

@Component
public class AuthorWiring implements RuntimeWiringConfigurer {
    private final AuthorRepository authorRepository;
    public AuthorWiring(AuthorRepository authorRepository) {
        this.authorRepository = authorRepository;
    }
    @Override
    public void configure(RuntimeWiring.Builder builder) {
        builder.type("Query", typeWiring -> typeWiring
                        .dataFetcher("allAuthors", environment -> authorRepository.findAll())
                        .dataFetcher("author", environment -> authorRepository.getReferenceById(environment.getArgument("id")))
    }
}

這裡configure方法內部分別定義了兩個DataFetcher對象,用來指定author和allAuthors查詢資料的方式,可以看出依然是透過JPA去查詢資料。

定義GraphQL Controller

我麼定義GraphQLController用來接收web請求的入參,範例如下:

@RestController
@RequestMapping("graphql")
public class GraphQLController {
    private final GraphQL graphQL;
    @Autowired
    public GraphQLController(GraphQlSource graphQlSource) {
        graphQL = graphQlSource.graphQl();
    }
    @PostMapping("query")
    public ResponseEntity<Object> query(@RequestBody String query) {
        ExecutionResult result = graphQL.execute(query);
        return ResponseEntity.ok(result.getData());
    }
}

程式碼中GraphQL物件是執行查詢的入口,但GraphQL只有一個私有的建構方法,所以不能直接注入,必須透過注入GraphQlSource的方式來取得GraphQL物件。

注意在GraphQL中我們只能使用String來接收參數,無法使用model對象,這是因為Graph請求參數並不是json結構。

測試Graph請求

我們建立一個graphql.http的文件,用於在idea中執行http請求



Send POST request with json body

POST http://localhost:8080/graphql/query

Content-Type: application/json

{
  author(id: 1) {
    id
    firstName
    lastName
    birthdate

  }

}

Send POST request with json body

POST http://localhost:8080/graphql/query##Content -Type: application/json

{
  allAuthors {
    id
    firstName
    lastName
    birthdate

  }
#}

} #執行author(id: 1) 的查詢,可以看到正常回傳結果了。如果我們只需要 firstName和lastName兩個字段,那麼在請求入參中直接去掉id和birthdate就好了,而不用改動任何後端代碼。

SpringBoot怎麼使用GraphQL開發Web API

SpringBoot怎麼使用GraphQL開發Web API

###

以上是SpringBoot怎麼使用GraphQL開發Web API的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除