傳統的Restful API 存在諸多的問題,首先它無法控制返回的字段,前端也無法預判後端的返回結果,另外不同的返回結果對應不同的請求地址,這就導致了多次請求的問題。而GraphQL正是基於這樣的背景而建構出來的API查詢語言,相對於傳統Restful API 它具有以下幾個優點:
靈活性:GraphQL 可以根據客戶端的需求靈活地查詢數據,而不是像RESTful API 那樣傳回固定結構的資料。
減少網路請求:GraphQL 允許客戶端在一次請求中取得多個資源,這有助於減少網路請求的數量並提高效能。
強型別:GraphQL 有一個強型別系統,客戶端可以在編譯時偵測到查詢中的錯誤,這有助於減少執行時間錯誤。
可快取:GraphQL 具有可快取性,這意味著伺服器可以快取查詢的結果,從而提高效能和可擴展性。
文件化:GraphQL 具有自我文件化的能力,使得開發者可以快速了解 API 的結構和功能。
如果後端語言為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 {
birthdate:
id:Int
firstName:String
lastName:String
email:String
birthdate:
email:String
##}
##實作RuntimeWiringConfigurerRuntimeWiringConfigurer是實現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請求
#}} #執行author(id: 1) 的查詢,可以看到正常回傳結果了。如果我們只需要 firstName和lastName兩個字段,那麼在請求入參中直接去掉id和birthdate就好了,而不用改動任何後端代碼。 ###POST http://localhost:8080/graphql/query
Send POST request with json bodyContent-Type: application/json
}
{
author(id: 1) {
id
firstName
lastName
birthdate}
Send POST request with json bodyPOST http://localhost:8080/graphql/query##Content -Type: application/json
}
{
allAuthors {
id
firstName
lastName
birthdate
以上是SpringBoot怎麼使用GraphQL開發Web API的詳細內容。更多資訊請關注PHP中文網其他相關文章!