92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线

Swagger-的使用(詳細教程)

2023-2-1    前端達人


前言

作為后端開放人員,最煩的事就是自己寫接口文檔和別人沒有寫接口文檔,不管是前端還是后端開發,多多少少都會被接口文檔所折磨,前端會抱怨后端沒有及時更新接口文檔,而后端又會覺得編寫接口文檔太過麻煩。Swagger 可以較好的接口接口文檔的交互問題,以一套標準的規范定義接口以及相關的信息,就能做到生成各種格式的接口文檔,生成多種語言和客戶端和服務端的代碼,以及在線接口調試頁面等等。只需要更新 Swagger 描述文件,就能自動生成接口文檔,做到前端、后端聯調接口文檔的及時性和便利性。

一、簡介

官網:https://swagger.io/

Swagger 是一個規范且完整的框架,用于生成、描述、調用和可視化 RESTful 風格的 Web 服務。

Swagger 的目標是對 REST API 定義一個標準且和語言無關的接口,可以讓人和計算機擁有無須訪問源碼、文檔或網絡流量監測就可以發現和理解服務的能力。當通過 Swagger 進行正確定義,用戶可以理解遠程服務并使用最少實現邏輯與遠程服務進行交互。與為底層編程所實現的接口類似,Swagger 消除了調用服務時可能會有的猜測。

Swagger 的優勢

  • 支持 API 自動生成同步的在線文檔:使用 Swagger 后可以直接通過代碼生成文檔,不再需要自己手動編寫接口文檔了,對程序員來說非常方便,可以節約寫文檔的時間去學習新技術。
  • 提供 Web 頁面在線測試 API:光有文檔還不夠,Swagger 生成的文檔還支持在線測試。參數和格式都定好了,直接在界面上輸入參數對應的值即可在線測試接口。

二、基本使用

1. 導入相關依賴

通過在項目中引入 Springfox,可以掃描相關的代碼,生成該描述文件,進而生成與代碼一致的接口文檔和客戶端代碼。

 <!-- swagger --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-spring-web</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

2. 編寫配置文件

在配置文件 config 目錄下,添加 swagger 的配置文件 SwaggerConfig.java

@Configuration // 配置類 @EnableSwagger2 // 開啟 swagger2 的自動配置 public class SwaggerConfig { } 
  • 1
  • 2
  • 3
  • 4

這個時候 Swagger 已經算是整合到項目之中了,可以啟動下服務,輸入:http://localhost:8080/swagger-ui.html# (這里我的項目端口是 8868 ,項目路徑是 /mike,所以我打開的文檔地址為 http://localhost:8868/mike/swagger-ui.html# )即可查看 swagger 文檔。

在這里插入圖片描述
可以看到 Swagger 文檔中大概有這四類信息

  • 基本信息
  • 接口信息
  • 實體類信息

2.1 配置基本信息

Swagger 有自己的實例 Docket,如果我們想要自定義基本信息,可以使用 docket 來配置 swagger 的基本信息,基本信息的設置在 ApiInfo 這個對象中。

Swagger 默認的基本信息展示

在這里插入圖片描述

ApiInfo 中默認的基本設置

  • title:Api Documentation
  • description:Api Documentation
  • version:1.0
  • termsOfServiceUrl:urn:tos
  • contact:無
  • license:Apache 2.0
  • licenseUrl:http://www.apache.org/licenses/LICENSE-2.0

SwaggerConfig.java 配置文件添加以下內容:

 @Bean public Docket docket() { // 創建一個 swagger 的 bean 實例 return new Docket(DocumentationType.SWAGGER_2) // 配置基本信息 .apiInfo(apiInfo()) ; } // 基本信息設置 private ApiInfo apiInfo() { Contact contact = new Contact( "米大傻", // 作者姓名 "https://blog.csdn.net/xhmico?type=blog", // 作者網址 "777777777@163.com"); // 作者郵箱 return new ApiInfoBuilder() .title("多加辣-接口文檔") // 標題 .description("眾里尋他千百度,慕然回首那人卻在燈火闌珊處") // 描述 .termsOfServiceUrl("https://www.baidu.com") // 跳轉連接 .version("1.0") // 版本 .license("Swagger-的使用(詳細教程)") .licenseUrl("https://blog.csdn.net/xhmico/article/details/125353535") .contact(contact) .build(); } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

重啟服務,打開 Swagger 文檔,基本信息改變如下所示:

在這里插入圖片描述

2.2 配置接口信息

默認情況下,Swagger 是會展示所有的接口信息的,包括最基礎的 basic-error 相關的接口

在這里插入圖片描述

有時候我們希望不要展示 basic-error-controller 相關的接口,或者是說這想要顯示某些接口,比如說:user-controller 下的接口,由該怎么去實現呢?這個時候就需要設置 掃描接口

 @Bean public Docket docket() { // 創建一個 swagger 的 bean 實例 return new Docket(DocumentationType.SWAGGER_2) // 配置接口信息 .select() // 設置掃描接口 // 配置如何掃描接口 .apis(RequestHandlerSelectors //.any() // 掃描全部的接口,默認 //.none() // 全部不掃描 .basePackage("com.duojiala.mikeboot.controller") // 掃描指定包下的接口,最為常用 //.withClassAnnotation(RestController.class) // 掃描帶有指定注解的類下所有接口 //.withMethodAnnotation(PostMapping.class) // 掃描帶有只當注解的方法接口 ) .paths(PathSelectors .any() // 滿足條件的路徑,該斷言總為true //.none() // 不滿足條件的路徑,該斷言總為false(可用于生成環境屏蔽 swagger) //.ant("/user/**") // 滿足字符串表達式路徑 //.regex("") // 符合正則的路徑 ) .build(); } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

可根據自己的需求去設置對應的配置,這里我就不再一一贅述了,以上是我所設置的配置,重啟服務,打開 Swagger 文檔,接口信息改變如下所示:

在這里插入圖片描述

可以看到之前 basic-error-controller 相關的接口已經沒有了

2.3 配置分組信息

Swagger 默認只有一個 default 分組選項,如果沒有設置,所有的接口都會顯示在 default `分組下,如果功能模塊和接口數量一多,就會顯得比較凌亂,不方便查找和使用。

swagger 文檔中組名默認是 default,可通過 .groupName(String )

在這里插入圖片描述

 @Bean public Docket docket() { // 創建一個 swagger 的 bean 實例 return new Docket(DocumentationType.SWAGGER_2) .groupName("mike") // 修改組名為 "mike" ; } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

修改后:
在這里插入圖片描述
如果需要配置多個組的話,就需要配置多個 docket() 方法,這里我就簡單寫兩組,代碼如下:

 /**
     * 展示 controller 包下所有的接口
     */ @Bean public Docket docket1() { // 創建一個 swagger 的 bean 實例 return new Docket(DocumentationType.SWAGGER_2) .groupName("mike") // 修改組名為 "mike" // 配置接口信息 .select() // 設置掃描接口 // 配置如何掃描接口 .apis(RequestHandlerSelectors .basePackage("com.duojiala.mikeboot.controller") // 掃描指定包下的接口,最為常用 ) .paths(PathSelectors .any() // 滿足條件的路徑,該斷言總為true ) .build(); } /**
     * 展示路徑為 /error 的所有接口(基礎接口)
     */ @Bean public Docket docket2() { // 創建一個 swagger 的 bean 實例 return new Docket(DocumentationType.SWAGGER_2) .groupName("yank") // 修改組名為 "yank" // 配置接口信息 .select() // 設置掃描接口 // 配置如何掃描接口 .apis(RequestHandlerSelectors .any() // 掃描全部的接口,默認 ) .paths(PathSelectors .ant("/error") // 滿足字符串表達式路徑 ) .build(); } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

重啟服務,打開 Swagger 文檔,接口信息改變如下所示:

組名為 mike 的文檔中只有 user-controller 相關的接口信息

在這里插入圖片描述

組名為 yank 的文檔中只有 basic-error-controller 相關的接口信息

在這里插入圖片描述


3. 控制 Swagger 的開啟

在開發或者測試環境下,我們開啟 swagger 會方便前端和后端的交互,但是如果在生產環境下也開啟 swagger 的話,是會將接口暴露出去的,有極大風險,如何讓 swagger 根據不同的環境來決定是否開啟?

這里我準備了四個項目的配置文件,devtest、pro 三個環境的配置文件僅是端口上的不同

在這里插入圖片描述

  • application.yml -------------------------- 全局配置文件
  • application-dev.yml -------------------- 開發環境配置文件
  • application-test.yml -------------------- 測試環境配置文件
  • application-pro.yml -------------------- 生產環境配置文件

application.yml 內容如下,用于指定選擇的環境:

spring: profiles: active: dev 
  • 1
  • 2
  • 3

可以通過代碼判斷此時是在什么環境:dev、test、pro,如果是在 pro 生產環境,則關閉 swagger。

 /**
     * swagger 配置
     * @param environment 環境
     */ @Bean public Docket docket(Environment environment) { // 設置環境范圍 Profiles profiles = Profiles.of("dev","test"); // 如果在該環境返回內則返回:true,反之返回 false boolean flag = environment.acceptsProfiles(profiles); // 創建一個 swagger 的 bean 實例 return new Docket(DocumentationType.SWAGGER_2) .enable(flag) // 是否開啟 swagger:true -> 開啟,false -> 關閉 ; } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

在 application.yml 全局配置文件中環境指向 dev 時,是可以打開 swagger 的

在這里插入圖片描述
如果我將 application.yml 全局配置文件中環境指向 pro 時,就不能打開 swagger 了,提示 Could not render e, see the console

在這里插入圖片描述

4. 常用注解使用

之前有說 Swagger 會將接口請求或者相應的實體類信息展示在 Models 下的,比如我 UserController.java 下有一個接口如下所示:

 @PostMapping(value = "/query-user-info") public ResponseBean queryUserInfo(@RequestBody @Validated IdReq req) { return ResponseBean.success(userService.queryUserInfo(req)); } 
  • 1
  • 2
  • 3
  • 4

它的請求體是 IdReq,響應是 ResponseBeanModels 展示這兩個實體類信息如下:

在這里插入圖片描述
前端可通過看這個 Models 知道后端定義實體類的信息。

@ApiModel

該注解是作用于類上面的,是用來描述類的一些基本信息的。

相關屬性:

  • value:提供類的一個備用名,如果不設置,默認情況下將使用 class 類的名稱
  • description:對于類,提供一個詳細的描述信息
  • parent:這個屬性用于描述的是類的一些父類信息
  • discriminator:這個屬性解釋起來比較麻煩,因為這個類主要體現在斷言當中
  • subTypes:可以通過這個屬性,指定我們想要使用的子類

譬如:這個為給 IdReq 這個類添加該注解

@Data @NoArgsConstructor @AllArgsConstructor @ApiModel(value = "Id請求體") public class IdReq { private String id; } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在這里插入圖片描述
可以看到這里的名字從 IdReq 變成 Id請求體 了

@ApiModelProperty

它的作用是添加和操作屬性模塊的數據。

該注解的使用詳情可參見博客:@ApiModelProperty注解的用法

這里我還是以 IdReq 類為例,為該類的屬性添加說明

@Data @NoArgsConstructor @AllArgsConstructor @ApiModel(value = "Id請求體") public class IdReq { @ApiModelProperty("主鍵id") private String id; } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在這里插入圖片描述
可以看到這里對該字段有一個備注說明。

@ApiOperation

該注解用來對某個方法/接口進行描述

該注解的使用詳情可參見博客:Swagger @ApiOperation 注解詳解

這里我以 UserController 下的接口為例:

 @PostMapping(value = "/query-user-info") @ApiOperation(value = "根據id查詢用戶詳情") public ResponseBean queryUserInfo(@RequestBody @Validated IdReq req) { return ResponseBean.success(userService.queryUserInfo(req)); } 
  • 1
  • 2
  • 3
  • 4
  • 5

在這里插入圖片描述
可以看見該接口就多了對其的描述信息。

@ApiParam

該注解使用在方法上或者參數上,字段說明,表示對參數的添加元數據(說明或者是否必填等)

相關屬性:

  • name:參數名
  • value:參數說明
  • required:是否必填

這里我以 UserController 下的接口為例:

 @PostMapping(value = "/query-user-infos") @ApiOperation(value = "條件查詢用戶信息") public ResponseBean queryUserInfos( // name 用戶名稱 不必填 @ApiParam(value = "用戶名稱", required = false) @RequestParam(required = false) String name, // gender 用戶性別 必填 @ApiParam(value = "用戶性別", required = true) @RequestParam(required = true) GenderEnum gender ) { return ResponseBean.success(userService.queryUserInfos(name,gender)); } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在這里插入圖片描述
這里會展示請求參數的備注信息,以及是否必填等。

5. 接口調用

使用 swagger 除了讓前后端交互變得方便,也讓接口的請求變得簡單,只需要填寫好請求所需要的參數信息,便可直接發起請求。

比如說接口 /user/query-user-info

點擊 Try it out

在這里插入圖片描述
設置好請求所需的參數,點擊 Execute 執行

在這里插入圖片描述

就能看到接口響應的結果了

在這里插入圖片描述

接口 /user/query-user-infos 也差不多

在這里插入圖片描述
在這里插入圖片描述


三、進階使用

1. 添加請求頭

有時候我們的接口是需要獲取請求頭信息的,這樣的話就還需要在 swagger 配置中添加請求頭的配置。

 @Bean public Docket docket() { // 設置請求頭 List<Parameter> parameters = new ArrayList<>(); parameters.add(new ParameterBuilder() .name("token") // 字段名 .description("token") // 描述 .modelRef(new ModelRef("string")) // 數據類型 .parameterType("header") // 參數類型 .defaultValue("default value") // 默認值:可自己設置 .hidden(true) // 是否隱藏 .required(false) // 是否必須 .build()); // 創建一個 swagger 的 bean 實例 return new Docket(DocumentationType.SWAGGER_2) .groupName("mike") // 修改組名為 "mike" // 配置接口信息 .select() // 設置掃描接口 // 配置如何掃描接口 .apis(RequestHandlerSelectors .basePackage("com.duojiala.mikeboot.controller") // 掃描指定包下的接口,最為常用 ) .paths(PathSelectors .any() // 滿足條件的路徑,該斷言總為true ) .build() // 添加請求頭參數 .globalOperationParameters(parameters); } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

比如接口:

 @GetMapping(value = "/get-token") @ApiOperation(value = "獲取請求頭中的token信息") public void getToken( @RequestHeader(value = "token",required = false) String token ) { // 直接獲取 token 信息 System.out.println("token = " + token); // 通過代碼獲取 ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); if (servletRequestAttributes != null) { HttpServletRequest request = servletRequestAttributes.getRequest(); String header = request.getHeader("token"); System.err.println("header = " + header); } } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

在這里插入圖片描述
可以看到這個接口已經可以去設置請求頭了,調用接口

在這里插入圖片描述
后端也能獲取到。

藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請加藍小助,微信號:ben_lanlan,報下信息,藍小助會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系01063334945。


分享此文一切功德,皆悉回向給文章原作者及眾讀者.
免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。


藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務、UI設計公司、界面設計公司、UI設計服務公司、數據可視化設計公司、UI交互設計公司、高端網站設計公司、UI咨詢、用戶體驗公司、軟件界面設計公司


日歷

鏈接

個人資料

藍藍設計的小編 http://m.skdbbs.com

存檔

92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线
一道在线中文一区二区三区| 亚洲电影第三页| 国产中文欧美日韩在线| 国产日韩1区| 波多野结衣欧美| 国产成人极品视频| av网址在线免费观看| 国产超碰在线一区| 欧洲亚洲精品久久久久| 一本一道波多野毛片中文在线| 视频一区二区欧美| 久久国产一区二区三区| 日韩欧美一级二级三级久久久| 久久99热这里只有精品国产| 亚洲精品一区二区三区四区五区| 亚洲片在线观看| www久久久| 亚洲电影第三页| 91成人观看| 国产三区二区一区久久| 51精品视频| 99re66热这里只有精品8| 99久久99久久综合| 全球成人免费直播| 国产视色精品亚洲一区二区| av影院在线免费观看| 1000部精品久久久久久久久| 9999热视频在线观看| 久久精品国产www456c0m| 色偷偷亚洲男人天堂| 91久久偷偷做嫩草影院| 97在线精品国自产拍中文| 欧美黑人性视频| 久久久久久国产精品| 欧美精品欧美精品系列c| 精品夜色国产国偷在线| 91在线视频在线| 国产成人av一区二区三区在线观看| 日韩一二三区不卡| 色妞www精品视频| xxx欧美精品| 欧美韩国日本不卡| 精品日韩欧美| 91九色在线免费视频| 久久久91精品国产一区二区精品| 白嫩白嫩国产精品| 国产成人看片| 久久97久久97精品免视看秋霞| 欧美成人性网| 男人的天堂亚洲| 久久久久北条麻妃免费看| 久久精品福利视频| 亚洲人成自拍网站| 国产一区二区三区不卡av| 日韩免费福利电影在线观看| 视频精品国内| 欧美三级电影网| 久久免费影院| 成人性生交大片免费网站| 肉色丝袜一区二区| 久久久噜噜噜久噜久久| 欧美中文字幕一二三区视频| 亚洲三级欧美| 日韩欧美电影一区| 欧美网站大全在线观看| 精品视频亚洲| 免费黄色电影在线观看| 欧美日韩在线直播| 青青草精品视频| 蜜臂av日日欢夜夜爽一区| 精品69视频一区二区三区| 精品国产一区二区三区不卡蜜臂| 99国产精品久久久久老师| 91嫩草国产线观看亚洲一区二区| 成人中文视频| 日韩av色在线| 欧美一级在线播放| 在线观看一区不卡| 久久精品视频在线免费观看| 姬川优奈av一区二区在线电影| 日韩国产精品一区二区三区| 欧美福利小视频| 色与欲影视天天看综合网| 国产精品一区二区美女视频免费看| 丝袜连裤袜欧美激情日韩| 欧美黄污视频| 色婷婷综合视频在线观看| 韩国三级大全久久网站| 91资源在线观看| 5858s免费视频成人| 国产91精品久久久久久久网曝门| 日韩视频免费观看高清完整版在线观看| 日韩av电影中文字幕| 国产亚洲综合精品| 久久久精品一区二区毛片免费看| 91精品国产欧美一区二区成人| 亚洲福利在线视频| 女女同性女同一区二区三区91| 欧美无人高清视频在线观看| 国产一区二区三区国产精品| 国外成人在线视频网站| 国产精品系列在线播放| 极品尤物一区二区三区| 亚洲精品小区久久久久久| 青娱乐一区二区| 九九热精品视频在线观看| 蜜芽在线免费观看| 中文字幕中文字幕在线一区| 2017亚洲天堂1024| 国产精品激情av在线播放| 99精品1区2区| 51久久夜色精品国产麻豆| 亚洲欧美一区二区原创| 色女孩综合影院| 久久一级大片| 国产高清视频免费最新在线| 西野翔中文久久精品字幕| 欧美中文在线字幕| 777精品视频| 777久久久精品| 欧美精品中文字幕一区二区| 日韩精品一二三四| 久久久www成人免费无遮挡大片| 国产精品麻豆欧美日韩ww| 国产91精品久久久久久| 国产精品久久久久9999吃药| 最新97超碰在线| 在线观看的日韩av| 国产一区二区三区四| 国产精品视频在线免费观看| 亚洲国产高清视频| 日韩一区二区三区高清免费看看| 亚洲人妖在线| 日韩激情视频在线观看| 日韩精品成人| 欧美一区二区三区四区五区六区| 亚洲欧洲精品在线| 在线激情免费视频| 欧美破处大片在线视频| 日韩美女在线观看一区| 麻豆精品一区二区| 国产精品天天看天天狠| 奇门遁甲1982国语版免费观看高清| 国产精品免费一区二区三区| 中文字幕一区二区三区乱码在线| 成人勉费视频| 久久国产一区二区三区| 777国产偷窥盗摄精品视频| 成人免费福利片| 99久久99久久精品免费看蜜桃| 99热99re6国产在线播放| 欧美一二三区精品| 欧美日韩精品| 成人永久免费| 欧美激情一区二区三区不卡| 午夜精品一区二区三区电影天堂| 欧美h视频在线| 久久久欧美精品| 999久久久| 日本a在线播放| 色先锋aa成人| 国产精品日韩精品中文字幕| 蜜桃一区二区三区四区| 欧美激情1区2区3区|