前言
傳統的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 {
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中文網其他相關文章!

在使用IntelliJIDEAUltimate版本啟動Spring...

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...

Redis緩存方案如何實現產品排行榜列表的需求?在開發過程中,我們常常需要處理排行榜的需求,例如展示一個�...

將姓名轉換為數字以實現排序的解決方案在許多應用場景中,用戶可能需要在群組中進行排序,尤其是在一個用...

電商平台SKU和SPU表設計詳解本文將探討電商平台中SKU和SPU的數據庫設計問題,特別是如何處理用戶自定義銷售屬...

在Idea中如何設置SpringBoot項目默認運行配置列表在使用IntelliJ...


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

SublimeText3 Linux新版
SublimeText3 Linux最新版

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

禪工作室 13.0.1
強大的PHP整合開發環境

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。