自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

SpringBoot開發(fā)秘籍之集成Graphql Query

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

[[394594]]

概述

REST作為一種現(xiàn)代網(wǎng)絡(luò)應(yīng)用非常流行的軟件架構(gòu)風(fēng)格受到廣大WEB開發(fā)者的喜愛,在目前軟件架構(gòu)設(shè)計(jì)模式中隨處可見REST的身影,但是隨著REST的流行與發(fā)展,它的一個(gè)最大的缺點(diǎn)開始暴露出來:

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

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

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

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

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

場景模擬

考慮下面的場景:

用戶 與 文章 是一對多的關(guān)系,一個(gè)用戶可以發(fā)表多篇文章,同時(shí)又可以根據(jù)文章找到對應(yīng)的作者。

我們需要構(gòu)建以下幾個(gè)Graphql查詢:

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

當(dāng)然項(xiàng)目是基于SpringBoot開發(fā)的。

開發(fā)實(shí)戰(zhàn)

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

創(chuàng)建一個(gè)SpringBoot項(xiàng)目

通過IDEA創(chuàng)建一個(gè)SpringBoot項(xiàng)目,并引入對應(yīng)的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實(shí)體類

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.  

定義了兩個(gè)JAVA實(shí)體:Post,User。

編寫Schema文件

在resources/schema目錄下創(chuàng)建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關(guān)鍵字定義了兩個(gè)對象,User與Post。在屬性后面添加!表明這是一個(gè)非空屬性,通過[Post]表明這是一個(gè)Post集合,類似于Java對象中List。

通過Query關(guān)鍵字定義了兩個(gè)查詢對象,getUserById,getPostById,分別返回User對象和Post對象。

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

編寫業(yè)務(wù)邏輯

PostService

  1. @Service 
  2. public class PostService implements GraphQLQueryResolver { 
  3.     /** 
  4.      * 為了測試,只查詢id為1的結(jié)果 
  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初體驗(yàn)","日記"); 
  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初體驗(yàn)1","日記"); 
  13.         Post post2 = new Post(2,"Hello,Graphql2","Graphql初體驗(yàn)2","日記"); 
  14.         Post post3 = new Post(3,"Hello,Graphql3","Graphql初體驗(yàn)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的查詢需要實(shí)現(xiàn) GraphQLQueryResolver接口,由于為了便于演示我們并沒有引入數(shù)據(jù)層,請大家知悉。

配置Graphql 端點(diǎn)

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

配置完端口和端點(diǎn)后我們就可以對我們編寫的Graphql接口進(jìn)行測試了。

接口地址為:localhost:8080/graphql

測試

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

安裝插件

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

查詢

啟動(dòng)SpringBoot項(xiàng)目,然后在打開的Altair插件界面,輸入Graphql端點(diǎn) http://localhost:8080/graphql,然后點(diǎn)擊 Docs,將鼠標(biāo)移至需要的查詢上,點(diǎn)擊 ADD QUERY 即可添加對應(yīng)的查詢。

點(diǎn)擊Send Request 即可看到查詢結(jié)果:

然后我們在Query中可以根據(jù)我們的需要新增或刪除接口字段并重新請求接口,會看到響應(yīng)結(jié)果中也會根據(jù)我們的請求自動(dòng)返回結(jié)果:

小結(jié)

Graphql支持的數(shù)據(jù)操作有:

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

 

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

 

責(zé)任編輯:武曉燕 來源: JAVA日知錄
相關(guān)推薦

2021-05-18 09:25:54

SpringBoot參數(shù)校驗(yàn)

2022-12-05 07:13:44

2016-08-05 15:04:33

javascripthtmljs

2022-06-27 09:36:29

攜程度假GraphQL多端開發(fā)

2020-09-28 06:57:39

Node.jsGraphQLAPI

2021-05-26 06:22:34

SpringBootJPA后端開發(fā)

2021-06-05 07:34:00

SpringBootMybatis用法

2023-08-07 08:00:58

GraphQL類型端點(diǎn)

2021-07-11 07:05:28

RedisSpringBoot用法

2023-01-11 15:11:36

SpringEhcache

2020-04-07 13:40:13

GraphQLAPI編程語言

2017-08-18 12:15:35

大數(shù)據(jù)MySQLGraphQL

2021-04-23 09:09:19

GraphQLREST查詢

2013-06-18 10:52:12

大數(shù)據(jù)

2023-11-09 09:13:48

GraphQLAPI 架構(gòu)

2023-02-14 07:47:20

SpringBootEhcache

2023-12-01 07:28:40

SpringbootBean

2020-06-24 07:00:00

GraphQL API監(jiān)控

2019-12-09 08:00:00

GraphQLAPI架構(gòu)

2024-04-16 12:00:14

API系統(tǒng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號