SpringBoot3整合SpringDoc實(shí)現(xiàn)在線接口文檔的詳細(xì)過(guò)程
寫(xiě)在前面
在現(xiàn)目前項(xiàng)目開(kāi)發(fā)中,一般都是前后端分離項(xiàng)目。前端小姐姐負(fù)責(zé)開(kāi)發(fā)前端,苦逼的我們負(fù)責(zé)后端開(kāi)發(fā)
事實(shí)是一個(gè)人全干,在這過(guò)程中編寫(xiě)接口文檔就顯得尤為重要了。然而作為一個(gè)程序員,最怕的莫過(guò)于自己寫(xiě)文檔和別人不寫(xiě)文檔
大家都不想寫(xiě)文檔,那這活就交給今天的主角Swagger來(lái)實(shí)現(xiàn)了
一、專業(yè)名詞介紹
①OpenApi是什么?
解答:OpenApi是一個(gè)用于描述、定義和共享 RESTful API 文檔的規(guī)范。最新規(guī)范是 OpenAPI 3.0
② Swagger是什么?
解答: Swagger 是一個(gè)用于設(shè)計(jì)和測(cè)試 RESTful APIs 的工具。
它提供了API 描述、請(qǐng)求和響應(yīng)示例、API 測(cè)試和文檔生成等豐富的功能。最新版本是Swagger3,支持OpenAPI3.0規(guī)范
③ SpringFox 是什么?
SpringFox 是 Spring 社區(qū)維護(hù)的一個(gè)項(xiàng)目(非官方),幫助使用者將 Swagger 2 集成到 Spring 中。
目前國(guó)內(nèi)項(xiàng)目使用的都是它
github地址:https://github.com/springfox/springfox
④springDoc是什么?
解答: Spring-doc也是 Spring 社區(qū)維護(hù)的一個(gè)項(xiàng)目(非官方),幫助使用者將 Swagger 3 集成到 Spring 中
SpringDoc 支持 Swagger 頁(yè)面 Oauth2 登錄,相較于 SpringFox 而言,它的支撐時(shí)間更長(zhǎng),無(wú)疑是更好的選擇。
但是在國(guó)內(nèi)發(fā)展較慢,網(wǎng)上一找資料,出來(lái)的基本上是 Swagger2的內(nèi)容。
⑤ OpenAPI 、Spring-doc和 Swagger 之間的關(guān)系
解答:OpenAPI 定義了一種標(biāo)準(zhǔn)的格式來(lái)表示 API 文檔,而 Swagger 是一個(gè)實(shí)現(xiàn) OpenAPI 規(guī)范的工具
二、Swagger詳細(xì)簡(jiǎn)介
Swagger 江湖人稱“絲襪哥”,是一個(gè)幫助程序員生成接口文檔的利器。
只需要簡(jiǎn)單配置,就可以生成帶有漂亮UI界面的接口文檔,而且編寫(xiě)的接口代碼變了
接口文檔隨之也跟著變,做到了真正的解放雙手。
官網(wǎng)https://swagger.io/
Swagger 優(yōu)點(diǎn)
號(hào)稱世界上最流行的API框架
Restful Api文檔在線自動(dòng)生成器- 直接運(yùn)行,支持在線測(cè)試
API - 不僅僅支持Java,還支持多種語(yǔ)言(如:
PHP、Python、Node.js等)
三、小試牛刀
說(shuō)了這么多Swagger 的優(yōu)點(diǎn),接下來(lái)就小試牛刀,看看怎么將Swagger集成到SpringBoot中。
3.1、環(huán)境介紹
JDK:17SpringBoot:3.3.0Springdoc
注: 細(xì)心的小伙伴可能已經(jīng)發(fā)現(xiàn)了,在springboot3.0之前我用的都是Springfox來(lái)集成Swagger管理我們的API接口文檔,
但是Springfox已經(jīng)停止更新了,我們使用的是SpringBoot3 +jdk17 的環(huán)境后,Spring官網(wǎng)推薦了Springdoc 來(lái)整合swagger
3.2 新建一個(gè)springboot-web項(xiàng)目
3.3 添加依賴
由于篇幅原因,其他web項(xiàng)目相關(guān)依賴這里就不一一貼出來(lái)了。
第一個(gè)依賴是必須的,而且版本必須大于2.0.0
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-api</artifactId>
<version>2.2.0</version>
</dependency>注:
我們這里使用的是jdk17+springboot3.3.0 環(huán)境,原來(lái)swagger的V2和V3都不能用了,小伙伴們一定更要注意這兒

如果引入上面錯(cuò)誤的依賴,項(xiàng)目啟動(dòng)會(huì)報(bào)下面錯(cuò)誤,這時(shí)候我們引入上面正確的依賴重新啟動(dòng)項(xiàng)目即可

3.4 編寫(xiě)HelloController
新建一個(gè)controller包--->建立一個(gè)HelloController類

@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "hello";
}
}我們?cè)跒g覽器中輸入“http://localhost:8080/hello” 后回車(chē),出現(xiàn)如下界面,說(shuō)明我們的hello開(kāi)發(fā)成功了

3.5 訪問(wèn)swagger接口頁(yè)面
注:我們這里采用的是openapi ,所以就不用像swagger的V2和v3那樣添加配置類了
瀏覽器直接輸入:http://localhost:8080/swagger-ui/index.html 回車(chē)即可看到下面界面

整合swagger是不是很簡(jiǎn)單呢
四、修改接口

從上面截圖中我們看到,我們?cè)?code>HelloController 中只定義了一個(gè)接口,但是前端UI界面中出來(lái)個(gè)7種請(qǐng)求方式(GET、PUT、POST、DELETE、OPTIONS、HEAD、PATCH)的接口,這是為什么呢?
解答:@RequestMapping("/hello") 我們接口中只是指定了訪問(wèn)地址,并沒(méi)有指定請(qǐng)求方式
我們將注解修改成@RequestMapping(path = "/hello",method = RequestMethod.GET)
或者@GetMapping("/hello") 然后重啟服務(wù),我們看到界面上就只有一種請(qǐng)求方式的接口了

五、接口文檔常用配置
5.1 配置訪問(wèn)路徑
在application.yml中可以自定義api-docs和swagger-ui的訪問(wèn)路徑。當(dāng)然了,如果沒(méi)配置,默認(rèn)就是下面路徑
springdoc:
api-docs:
path: /v3/api-docs
swagger-ui:
path: /swagger-ui.html5.2 配置接口文檔基本信息
① 配置接口基本信息
新建一個(gè)config包--->并在包下建立一個(gè)SpringDocConfig配置類

② 配置接口文檔基礎(chǔ)信息
我們?cè)谂渲妙愔刑砑尤缦麓a,
@Configuration
public class SpringDocConfig {
@Bean
public OpenAPI openAPI() {
return new OpenAPI()
// 配置接口文檔基本信息
.info(this.getApiInfo())
;
}
private Info getApiInfo() {
return new Info()
// 配置文檔標(biāo)題
.title("SpringBoot3集成Swagger3")
// 配置文檔描述
.description("SpringBoot3集成Swagger3示例文檔")
// 配置作者信息
.contact(new Contact().name("程序員小凡").url("https://www.xiezhrspace.cn").email("1666397814@163.com"))
// 配置License許可證信息
.license(new License().name("Apache 2.0").url("https://www.xiezhrspace.cn"))
// 概述信息
.summary("SpringBoot3集成Swagger3示例文檔aaa")
.termsOfService("https://www.xiezhrspace.cn")
// 配置版本號(hào)
.version("2.0");
}
}前端頁(yè)面訪問(wèn)接口文檔頁(yè)面后顯示如下

② 配置接口servers信息
接口可能存在多環(huán)境,如開(kāi)發(fā)環(huán)境、測(cè)試環(huán)境、生產(chǎn)環(huán)境等
我們可以通過(guò)@OpenAPIDefinition 配合servers 屬性來(lái)配置不同環(huán)境,具體配置示例如下
@OpenAPIDefinition(
servers = {
@Server(description = "開(kāi)發(fā)環(huán)境服務(wù)器", url = "http://localhost:8080"),
@Server(description = "測(cè)試環(huán)境服務(wù)器", url = "https://test.xiezhr.com")
}
)
@Configuration
public class SpringDocConfig {
//...
}配置完成后,瀏覽器訪問(wèn)顯示如下

③ 配置外部文檔信息
有時(shí)候我們需要在在線接口文檔中可以顯示跳轉(zhuǎn)到API的一些外部文檔(比如 項(xiàng)目部署文檔等)
這個(gè)時(shí)候我們可以通過(guò)@OpenAPIDefinition 配合 externalDocs 屬性來(lái)配置外部文檔
具體配置如下
@OpenAPIDefinition(
externalDocs = @ExternalDocumentation(
description = "項(xiàng)目編譯部署說(shuō)明",
url = "http://localhost:8080/deplay/readme.md"
)
)
@Configuration
public class SpringDocConfig {
//......
}配置完后重啟服務(wù),瀏覽器訪問(wèn)接口文檔,顯示如下

SpringDocConfig 類完整配置代碼如下
@OpenAPIDefinition(
servers = {
@Server(description = "開(kāi)發(fā)環(huán)境服務(wù)器", url = "http://localhost:8080"),
@Server(description = "測(cè)試環(huán)境服務(wù)器", url = "https://test.xiezhr.com")
},
externalDocs = @ExternalDocumentation(
description = "項(xiàng)目編譯部署說(shuō)明",
url = "http://localhost:8080/deplay/readme.md"
)
)
@Configuration
public class SpringDocConfig {
@Bean
public OpenAPI openAPI() {
return new OpenAPI()
// 配置接口文檔基本信息
.info(this.getApiInfo())
;
}
private Info getApiInfo() {
return new Info()
// 配置文檔標(biāo)題
.title("SpringBoot3集成Swagger3")
// 配置文檔描述
.description("SpringBoot3集成Swagger3示例文檔")
// 配置作者信息
.contact(new Contact().name("程序員小凡").url("https://www.xiezhrspace.cn").email("1666397814@163.com"))
// 配置License許可證信息
.license(new License().name("Apache 2.0").url("https://www.xiezhrspace.cn"))
//
.summary("SpringBoot3集成Swagger3示例文檔aaa")
.termsOfService("https://www.xiezhrspace.cn")
// 配置版本號(hào)
.version("2.0");
}
}配置完上面信息后,重啟服務(wù),瀏覽器訪問(wèn):http://localhost:8080/v3/swagger-ui/index.html

5.3 配置掃描接口
應(yīng)用場(chǎng)景:
有時(shí)候我們?yōu)榱藰I(yè)務(wù)需要,我們建立了多個(gè)包下的接口,如admin包下的,common包下的接口,
為了安全起見(jiàn),我們只允許接口文檔中訪問(wèn)comm包下面的接口。
在不加任何配置的情況下,所以接口都會(huì)默認(rèn)顯示,具體如下

配置掃描接口包:
在application.yml中可以自定義要掃描的接口包
springdoc: packages-to-scan: com.xiezhr.swaggerdemo.common.controller
配置好之后重啟服務(wù),我們發(fā)現(xiàn)前臺(tái)UI只顯示了common包下面的接口了

5.4 配置接口文檔開(kāi)關(guān)
使用場(chǎng)景:
為了接口安全,我們一般需要在測(cè)試(test)環(huán)境或者開(kāi)發(fā)(dev)環(huán)境中開(kāi)啟接口文檔,而在生產(chǎn)(prod)環(huán)境中 關(guān)閉接口文檔
這個(gè)應(yīng)該怎么做呢?
這里涉及到SpringBoot多環(huán)境配置,忘記的小伙伴可以翻一翻之前的文章。傳送門(mén):
我們創(chuàng)建三個(gè)配置文件,分別為
- ①
application-dev.yml開(kāi)發(fā)環(huán)境 - ②
application-test.yml測(cè)試環(huán)境 - ③
application-prod.yml生產(chǎn)環(huán)境
只需在①和②配置文件中添加如下配置
springdoc:
api-docs:
enabled: true而③配置文件中添加
springdoc:
api-docs:
enabled: false通過(guò)上面配置后,我們?cè)陂_(kāi)發(fā)和測(cè)試環(huán)境下:就能正常訪問(wèn)http://localhost:8080/v3/swagger-ui/index.html#/
而在生產(chǎn)環(huán)境下就無(wú)法訪問(wèn),報(bào)如下錯(cuò)誤

5.5 配置API分組
為了演示API分組,我們?cè)?code>controller包下面再建立admin包和common包,包下分別添加AdminController和CommonController接口類,結(jié)構(gòu)及代碼如下

① AdminController類
// AdminController
@RestController
@RequestMapping("/admin")
public class AdminController {
@GetMapping("/index")
public String admin(){
return "admin";
}
}② CommonController 類
@RestController
@RequestMapping("/common")
public class CommonController {
@GetMapping("/hello")
public String hello(){
return "hello";
}
}在默認(rèn)情況(沒(méi)有分組)的情況下,所有包下接口都顯示在一一個(gè)默認(rèn)組下面,如/common/* 和/admin/* 訪問(wèn)路徑下的接口都顯示在一起,如下圖所示

這時(shí),如果/common/* 下的接口比較多,/admin/* 下的接口也比較多,界面上顯示就很混亂
解決辦法就是添加分組信息,我們?cè)?code>SpringDocConfig 配置類中添加如下代碼,這樣就把接口分為了"common通用模塊組" 和"admin模塊組" 兩個(gè)組
@Bean("commonGroupApi")
public GroupedOpenApi webGroupApi() {
return GroupedOpenApi.builder().group("common通用模塊組")
.pathsToMatch("/common/**")
.build();
}
@Bean("adminGroupApi")
public GroupedOpenApi adminGroupApi() {
return GroupedOpenApi.builder().group("admin模塊組")
.pathsToMatch("/admin/**")
.build();
}重啟服務(wù),再訪問(wèn)http://localhost:8080/v3/swagger-ui/index.html 如下

5.6 配置接口信息
① @Tag 注解使用
對(duì)一個(gè) operation 進(jìn)行說(shuō)明或定義的標(biāo)簽,用在類或方法上,也可以用在 @OpenAPIDefinition 中定義標(biāo)簽。
常用參數(shù):
name: 名稱description: 接口描述信息
示例:
用在類上
@RestController
@RequestMapping("/common")
@Tag(name = "公共接口", description = "公共接口")
public class CommonController {
//......
}② @Operation 注解使用
用于說(shuō)明方法用途,用在方法上。
參數(shù):
summary:方法概要,方法的一個(gè)簡(jiǎn)單介紹,建議 120 個(gè)字符內(nèi)description:方法描述,一般是很長(zhǎng)的內(nèi)容hidden:是否隱藏
示例:
@GetMapping("/hello")
@Operation(summary = "hello接口", description = "hello接口描述" ,hidden = true)
public String hello(){
return "hello";
}③ @Parameter注解使用
用于說(shuō)明方法參數(shù),用在方法參數(shù)上。
參數(shù):
name:指定的參數(shù)名in:參數(shù)位置,可選query、header、path或cookie,默認(rèn)為空,表示忽略description:參數(shù)描述required:是否必填,默認(rèn)為false
示例:
@GetMapping("/user/{id}")
public User getUser( @Parameter(name = "id",in = ParameterIn.PATH,description = "用戶ID",required = true) @PathVariable("id") Integer id){
User user = userService.getUserById(id);
return user;
}前端頁(yè)面查看

④ @ApiResponse 注解使用
用于說(shuō)明一個(gè)響應(yīng)信息,用在 @ApiResponses 中。
參數(shù):
responseCode:HTTP 響應(yīng)碼description:描述
示例:
@GetMapping("/user/{id}")
@Operation(summary = "獲取用戶信息", description = "根據(jù)用戶ID獲取用戶信息")
@ApiResponses(value ={
@ApiResponse(responseCode = "200", description = "請(qǐng)求成功"),
@ApiResponse(responseCode = "404", description = "用戶不存在")
})
public User getUser( @Parameter(name = "id",in = ParameterIn.PATH,description = "用戶ID",required = true) @PathVariable("id") Integer id){
User user = userService.getUserById(id);
return user;
}
完整配置
@RestController
@RequestMapping("/common")
@Tag(name = "公共接口", description = "公共接口")
public class CommonController {
@Autowired
private IUserService userService;
@GetMapping("/hello")
@Operation(summary = "hello接口", description = "hello接口描述" ,hidden = true)
public String hello(){
return "hello";
}
@GetMapping("/hi")
@Operation(summary = "hi接口", description = "hi接口描述")
public String Hi(){
return "Hi 程序員小凡";
}
@GetMapping("/user/{id}")
@Operation(summary = "獲取用戶信息", description = "根據(jù)用戶ID獲取用戶信息")
@ApiResponses(value ={
@ApiResponse(responseCode = "200", description = "請(qǐng)求成功"),
@ApiResponse(responseCode = "404", description = "用戶不存在")
})
public User getUser( @Parameter(name = "id",in = ParameterIn.PATH,description = "用戶ID",required = true) @PathVariable("id") Integer id){
User user = userService.getUserById(id);
return user;
}
}重啟后,瀏覽器訪問(wèn)http://localhost:8080/v3/swagger-ui/index.html 如下

5.7 配置實(shí)體信息
① 新建一個(gè)User實(shí)體類
@Data
public class User {
private String name;
private Integer age;
private String email;
private String address;
}② @Schema標(biāo)簽使用
用于描述數(shù)據(jù)對(duì)象信息或數(shù)據(jù)對(duì)象屬性,比如各種POJO類及屬性,用在類或類屬性上。
參數(shù):
name:屬性名稱description:屬性描述required:是否必須minLength:字符最小長(zhǎng)度maxLength:字符最大長(zhǎng)度
③使用示例:
@Data
@Schema(description = "用戶實(shí)體類",name = "User")
public class User {
@Schema(description = "用戶名",name = "name",minLength = 6,maxLength = 20,required = true)
private String name;
@Schema(description = "年齡",name = "age",required = true,minimum = "1",maximum = "100")
private Integer age;
@Schema(description = "郵箱",name = "email",required = true)
private String email;
@Schema(description = "地址",name = "address")
private String address;
}④ 瀏覽器訪問(wèn):http://localhost:8080/v3/swagger-ui/index.html ,我們看到配置的實(shí)體信息顯示出來(lái)了

六、接口調(diào)試
通過(guò)上面各種配置之后,我們的在線接口文檔基本上生成得差不多了。接下來(lái)我們就來(lái)說(shuō)說(shuō)怎么使用在線接口文檔進(jìn)行接口測(cè)試
① 測(cè)試說(shuō)明
在之前小節(jié)中我們開(kāi)發(fā)了要給根據(jù)用戶ID 獲取用戶信息的接口getUser。我們現(xiàn)在要做的就是在前端UI界面中找到這個(gè)接口,
在開(kāi)發(fā)環(huán)境下輸入用戶ID值,然后獲取用戶信息。
② 選擇組信息
【獲取用戶信息】這個(gè)接口在,common通用模塊組下面,所以我們第一步就要前端UI界面右上角選擇這個(gè)組

② 選擇開(kāi)發(fā)環(huán)境
在Servers 下選擇配置好的開(kāi)發(fā)環(huán)境

③ 找到我們要測(cè)試的接口

④ 測(cè)試接口,獲取響應(yīng)數(shù)據(jù)
接口右邊下三角箭頭展開(kāi)接口------>點(diǎn)擊Try it out

輸入?yún)?shù):用戶ID------> 點(diǎn)擊【Execute】----->在Response body 中查看接口響應(yīng)信息

七、添加請(qǐng)求頭
很多時(shí)候我們接口都需要認(rèn)證之后才能訪問(wèn),這時(shí)候我們就需要接口調(diào)用的時(shí)候攜帶著Token信息
示例:
我們通過(guò)@RequestHeader 注解 獲取請(qǐng)求頭中token信息
@GetMapping("/index")
public String admin(@RequestHeader ("token") String token){
System.out.println("token>>>>>>>>>>>>>>>>>>>>>>>>"+token);
//token 驗(yàn)證
//.....各種業(yè)務(wù)邏輯
return "admin";
}
本文來(lái)自博客園,作者:xiezhr,轉(zhuǎn)載請(qǐng)注明原文鏈接:https://www.cnblogs.com/xiezhr/p/18253311
到此這篇關(guān)于SpringBoot3整合SpringDoc實(shí)現(xiàn)在線接口文檔的文章就介紹到這了,更多相關(guān)SpringBoot3在線接口文檔內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用proguard對(duì)maven構(gòu)建的springboot項(xiàng)目進(jìn)行混淆方式
文章介紹了如何使用ProGuard對(duì)Maven構(gòu)建的Spring Boot項(xiàng)目進(jìn)行混淆,并解決混淆后可能遇到的版本兼容性問(wèn)題和類名沖突問(wèn)題,主要步驟包括下載高版本的ProGuard、配置POM文件、添加ProGuard配置文件、修改Spring Boot啟動(dòng)文件以避免類名沖突2024-11-11
實(shí)體類或?qū)ο笮蛄谢瘯r(shí),忽略為空屬性的操作
這篇文章主要介紹了實(shí)體類或?qū)ο笮蛄谢瘯r(shí),忽略為空屬性的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
Java中HashMap與String字符串互轉(zhuǎn)的問(wèn)題解決
本文介紹了Java中HashMap與String字符串互轉(zhuǎn)的問(wèn)題解決,當(dāng)我們有需求將HashMap轉(zhuǎn)為Json格式的String時(shí),需要使用FastJson/Gson將HashMap轉(zhuǎn)為String,感興趣的可以了解一下2022-03-03
深入分析Comparable與Comparator及Clonable三個(gè)Java接口
接口不是類,而是對(duì)類的一組需求描述,這些類要遵從接口描述的統(tǒng)一格式進(jìn)行定義,這篇文章主要為大家詳細(xì)介紹了Java的Comparable,Comparator和Cloneable的接口,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-05-05
JAVA-4NIO之Channel之間的數(shù)據(jù)傳輸方法
下面小編就為大家?guī)?lái)一篇JAVA-4NIO之Channel之間的數(shù)據(jù)傳輸方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06
淺析Spring Security登錄驗(yàn)證流程源碼
這篇文章主要介紹了Spring Security登錄驗(yàn)證流程源碼解析,本文結(jié)合源碼講解登錄驗(yàn)證流程,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11
Spring Boot 把配置文件和日志文件放到j(luò)ar外部
如果不想使用默認(rèn)的application.properties,而想將屬性文件放到j(luò)ar包外面,怎么做呢?下面小編給大家?guī)?lái)了兩種方法解決Spring Boot 把配置文件和日志文件放到j(luò)ar外部問(wèn)題,感興趣的朋友一起看看吧2018-02-02
解決OpenFeign遠(yuǎn)程調(diào)用返回的對(duì)象總是null問(wèn)題
OpenFeign在SpringCloud中用于遠(yuǎn)程調(diào)用,配置簡(jiǎn)單,在使用Ribbon或Hystrix時(shí),需要注意path參數(shù)必須以/開(kāi)頭,否則回參會(huì)是null2024-11-11
Mybatis-plus和Mybatis出現(xiàn)版本不兼容的問(wèn)題解決
MyBatis-Plus?與?MyBatis?之間的兼容性問(wèn)題通常是由于版本不匹配引起的,本文主要介紹了Mybatis-plus和Mybatis出現(xiàn)版本不兼容的問(wèn)題解決,具有一定的參考價(jià)值,感興趣的可以了解一下2024-08-08

