天天看點

SpringBoot開發秘籍 - 內建Graphql Query

REST作為一種現代網絡應用非常流行的軟體架構風格受到廣大WEB開發者的喜愛,在目前軟體架構設計模式中随處可見REST的身影,但是随着REST的流行與發展,它的一個最大的缺點開始暴露出來:

在很多時候用戶端需要的資料往往在不同的地方具有相似性,但卻又不盡相同。 如同樣的使用者資訊,在有的場景下前端隻需要使用者的簡要資訊(名稱、頭像),在其他場景下又需要使用者的詳細資訊。當這樣的相似但又不同的地方多的時候,就需要開發更多的接口來滿足前端的需要。 随着這樣的場景越來越多,接口越來越多,文檔越來越臃腫,前後端溝通成本呈指數增加。

基于上面的場景,我們迫切需要有一種解決方案或架構,可以使得在使用同一個領域模型(DO、DTO)的資料接口時可以由前端指定需要的接口字段,而後端根據前端的需求自動适配并傳回對應的字段。

這就是我們今天的主角GraphQL。

考慮下面的場景:

SpringBoot開發秘籍 - 內建Graphql Query

使用者 與 文章 是一對多的關系,一個使用者可以發表多篇文章,同時又可以根據文章找到對應的作者。

我們需要建構以下幾個Graphql查詢:

根據使用者ID擷取使用者詳情,并擷取此使用者發表的所有文章

根據文章ID擷取文章詳情,并擷取文章作者的資訊

當然項目是基于SpringBoot開發的。

在正式開發之前我推薦你在IDEA上安裝一下 JS GraphQL插件,這個插件友善我們編寫Schema,文法糾錯,代碼高亮等等。。。

SpringBoot開發秘籍 - 內建Graphql Query

通過IDEA建立一個SpringBoot項目,并引入對應的jar

這裡主要需要引入 <code>graphql-spring-boot-starter</code>和 <code>graphql-java-tools</code>。

User

Post

定義了兩個JAVA實體:Post,User。

在resources/schema目錄下建立GraphQL Schema檔案

如上,我們通過 <code>type</code>關鍵字定義了兩個對象,User與Post。在屬性後面添加!表明這是一個非空屬性,通過[Post]表明這是一個Post集合,類似于Java對象中List。

通過Query關鍵字定義了兩個查詢對象,getUserById,getPostById,分别傳回User對象和Post對象。

關于schema的文法大家可以參考連結:<code>https://graphql.org/learn/schema</code>

PostService

UserService

基于Graphql的查詢需要實作 <code>GraphQLQueryResolver</code>接口,由于為了便于示範我們并沒有引入資料層,請大家知悉。

配置完端口和端點後我們就可以對我們編寫的Graphql接口進行測試了。

接口位址為:<code>localhost:8080/graphql</code>

這裡我使用的是Chrome浏覽器的 <code>Altair Graphal Client</code>插件,當然你還可以使用其他的用戶端工具,如:graphql-playground。

浏覽器輸入chrome://extensions/,在擴充中心搜尋Altair後即可添加至浏覽器。

SpringBoot開發秘籍 - 內建Graphql Query

啟動SpringBoot項目,然後在打開的Altair插件界面,輸入Graphql端點 http://localhost:8080/graphql,然後點選 <code>Docs</code>,将滑鼠移至需要的查詢上,點選 <code>ADD QUERY</code> 即可添加對應的查詢。

SpringBoot開發秘籍 - 內建Graphql Query

點選Send Request 即可看到查詢結果:

SpringBoot開發秘籍 - 內建Graphql Query

然後我們在Query中可以根據我們的需要新增或删除接口字段并重新請求接口,會看到響應結果中也會根據我們的請求自動傳回結果:

SpringBoot開發秘籍 - 內建Graphql Query

Graphql支援的資料操作有:

查詢(Query):擷取資料的基本查詢。

變更(Mutation):支援對資料的增删改等操作。

訂閱(Subscription):用于監聽資料變動、并靠websocket等協定推送變動的消息給對方。

SpringBoot開發秘籍 - 內建Graphql Query

本節内容我們基于SpringBoot完成了Query的資料操作,實作過程還是相對比較簡單。希望此文能讓大家對Graphql有一個整體的了解,如果大家對Graphql感興趣後面還會更新此系列文章,完成對其他資料操作的整合。

SpringBoot開發秘籍 - 內建Graphql Query