成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SpringBoot開發秘籍之集成Graphql Query

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

[[394594]]

概述

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

在很多時候客戶端需要的數據往往在不同的地方具有相似性,但卻又不盡相同。

如同樣的用戶信息,在有的場景下前端只需要用戶的簡要信息(名稱、頭像),在其他場景下又需要用戶的詳細信息。當這樣的相似但又不同的地方多的時候,就需要開發更多的接口來滿足前端的需要。

隨著這樣的場景越來越多,接口越來越多,文檔越來越臃腫,前后端溝通成本呈指數增加。

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

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

場景模擬

考慮下面的場景:

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

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

  • 根據用戶ID獲取用戶詳情,并獲取此用戶發表的所有文章
  • 根據文章ID獲取文章詳情,并獲取文章作者的信息

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

開發實戰

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

創建一個SpringBoot項目

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

  1. <dependencies> 
  2.  <dependency> 
  3.   <groupId>org.springframework.boot</groupId> 
  4.   <artifactId>spring-boot-starter</artifactId> 
  5.  </dependency> 
  6.  
  7.  <dependency> 
  8.   <groupId>org.springframework.boot</groupId> 
  9.   <artifactId>spring-boot-starter-web</artifactId> 
  10.  </dependency> 
  11.  
  12.  <!--graphql start--> 
  13.  <dependency> 
  14.   <groupId>com.graphql-java</groupId> 
  15.   <artifactId>graphql-spring-boot-starter</artifactId> 
  16.   <version>5.0.2</version> 
  17.  </dependency> 
  18.  <dependency> 
  19.   <groupId>com.graphql-java</groupId> 
  20.   <artifactId>graphql-java-tools</artifactId> 
  21.   <version>5.2.4</version> 
  22.  </dependency> 
  23.  <!--graphql end--> 
  24.  
  25.  <dependency> 
  26.   <groupId>org.projectlombok</groupId> 
  27.   <artifactId>lombok</artifactId> 
  28.  </dependency> 
  29. </dependencies> 

 

 

這里主要需要引入 graphql-spring-boot-starter和 graphql-java-tools。

建立Java實體類

User

  1. @Data 
  2. public class User { 
  3.     private int userId; 
  4.     private String userName; 
  5.     private String realName; 
  6.     private String email; 
  7.     private List<Post> posts; 
  8.  
  9.     public User() { 
  10.     } 
  11.  
  12.     public User(int userId, String userName, String realName, String email) { 
  13.         this.userId = userId; 
  14.         this.userName = userName; 
  15.         this.realName = realName; 
  16.         this.email = email; 
  17.     } 

Post

  1. @Data 
  2. public class Post { 
  3.     private int postId; 
  4.     private String title ; 
  5.     private String text; 
  6.     private String  category; 
  7.     private User user
  8.  
  9.     public Post() { 
  10.  
  11.     } 
  12.  
  13.     public Post(int postId, String title, String text, String category) { 
  14.         this.postId = postId; 
  15.         this.title = title; 
  16.         this.text = text; 
  17.         this.category = category; 
  18.     } 
  19.  

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

編寫Schema文件

在resources/schema目錄下創建GraphQL Schema文件

  1. schema { 
  2.     query: Query, 
  3.  
  4. type Query { 
  5.     # 獲取具體的用戶 
  6.     getUserById(id:Int) : User 
  7.     # 獲取具體的博客 
  8.     getPostById(id:Int) : Post 
  9.  
  10. type User { 
  11.     userId : ID!, 
  12.     userName : String, 
  13.     realName : String, 
  14.     email : String, 
  15.     posts : [Post], 
  16.  
  17. type Post { 
  18.     postId : ID!, 
  19.     title : String!, 
  20.     text : String, 
  21.     category: String 
  22.     userUser

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

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

關于schema的語法大家可以參考鏈接:https://graphql.org/learn/schema

編寫業務邏輯

PostService

  1. @Service 
  2. public class PostService implements GraphQLQueryResolver { 
  3.     /** 
  4.      * 為了測試,只查詢id為1的結果 
  5.      */ 
  6.     public Post getPostById(int id){ 
  7.         if(id == 1){ 
  8.             User user = new User(1,"javadaily","JAVA日知錄","zhangsan@qq.com"); 
  9.             Post post = new Post(1,"Hello,Graphql","Graphql初體驗","日記"); 
  10.             post.setUser(user); 
  11.             return post; 
  12.         }else
  13.             return null
  14.         } 
  15.  
  16.     } 

UserService

  1. @Service 
  2. public class UserService implements GraphQLQueryResolver { 
  3.     List<User> userList = Lists.newArrayList(); 
  4.  
  5.     public User getUserById(int id){ 
  6.         return userList.stream().filter(item -> item.getUserId() == id).findAny().orElse(null); 
  7.     } 
  8.  
  9.  
  10.     @PostConstruct 
  11.     public void  initUsers(){ 
  12.         Post post1 = new Post(1,"Hello,Graphql1","Graphql初體驗1","日記"); 
  13.         Post post2 = new Post(2,"Hello,Graphql2","Graphql初體驗2","日記"); 
  14.         Post post3 = new Post(3,"Hello,Graphql3","Graphql初體驗3","日記"); 
  15.         List<Post> posts = Lists.newArrayList(post1,post2,post3); 
  16.  
  17.         User user1 = new User(1,"zhangsan","張三","zhangsan@qq.com"); 
  18.         User user2 = new User(2,"lisi","李四","lisi@qq.com"); 
  19.  
  20.         user1.setPosts(posts); 
  21.         user2.setPosts(posts); 
  22.  
  23.  
  24.         userList.add(user1); 
  25.         userList.add(user2); 
  26.  
  27.     } 
  28.  

基于Graphql的查詢需要實現 GraphQLQueryResolver接口,由于為了便于演示我們并沒有引入數據層,請大家知悉。

配置Graphql 端點

  1. server.port = 8080 
  2. graphql.servlet.corsEnabled=true 
  3. # 配置端點 
  4. graphql.servlet.mapping=/graphql 
  5. graphql.servlet.enabled=true 

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

接口地址為:localhost:8080/graphql

測試

這里我使用的是Chrome瀏覽器的 Altair Graphal Client插件,當然你還可以使用其他的客戶端工具,如:graphql-playground。

安裝插件

瀏覽器輸入chrome://extensions/,在擴展中心搜索Altair后即可添加至瀏覽器。

查詢

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

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

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

小結

Graphql支持的數據操作有:

  • 查詢(Query):獲取數據的基本查詢。
  • 變更(Mutation):支持對數據的增刪改等操作。
  • 訂閱(Subscription):用于監聽數據變動、并靠websocket等協議推送變動的消息給對方。

 

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

 

責任編輯:武曉燕 來源: JAVA日知錄
相關推薦

2021-05-18 09:25:54

SpringBoot參數校驗

2022-12-05 07:13:44

2013-06-18 10:52:12

大數據

2016-08-05 15:04:33

javascripthtmljs

2022-06-27 09:36:29

攜程度假GraphQL多端開發

2020-09-28 06:57:39

Node.jsGraphQLAPI

2011-04-29 14:08:19

手機社交游戲游戲開發

2020-04-07 13:40:13

GraphQLAPI編程語言

2011-02-22 14:07:52

2017-08-18 12:15:35

大數據MySQLGraphQL

2021-04-23 09:09:19

GraphQLREST查詢

2021-05-26 06:22:34

SpringBootJPA后端開發

2021-06-05 07:34:00

SpringBootMybatis用法

2014-12-04 14:10:22

移動應用云

2023-08-07 08:00:58

GraphQL類型端點

2021-07-11 07:05:28

RedisSpringBoot用法

2023-01-11 15:11:36

SpringEhcache

2014-11-05 15:09:00

移動云平臺

2023-11-09 09:13:48

GraphQLAPI 架構

2012-12-27 17:43:11

應用商店開發者
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品99久久久久久www | 欧美成人激情视频 | 精品成人av | 午夜精品久久久久久不卡欧美一级 | 国产日韩欧美中文 | 国产精品免费一区二区 | 精品国产一区二区三区四区在线 | 夜久久| 色一级 | 日韩中文字幕一区二区 | 九色porny自拍视频 | 精品中文字幕一区 | 成人av播放 | 免费视频一区 | 美女福利网站 | 久久毛片 | 成人激情免费视频 | 久久手机在线视频 | 亚洲免费毛片 | 黄色毛片黄色毛片 | 毛片一区二区三区 | 日韩高清中文字幕 | 久久久精品网 | 欧洲一区二区三区 | 日韩欧美国产一区二区三区 | 欧美一区二区三区在线 | 欧美激情综合五月色丁香小说 | 国产在线观看一区二区三区 | 蜜桃臀av一区二区三区 | www.成人久久 | 精国产品一区二区三区四季综 | 日本午夜在线视频 | 97天天干 | 日本视频免费 | 精品中文字幕久久 | 精品一区二区三区免费毛片 | 国产欧美在线观看 | 一区二区三区欧美 | 99热在这里只有精品 | 久久久久网站 | 欧美激情国产精品 |