SpringBoot3整合SpringDoc实现在线接口文档
写在前面
在现目前项目开发中,一般都是前后端分离项目。前端小姐姐负责开发前端,苦逼的我们负责后端开发
事实是一个人全干,在这过程中编写接口文档就显得尤为重要了。然而作为一个程序员,最怕的莫过于自己写文档和别人不写文档
大家都不想写文档,那这活就交给今天的主角Swagger
来实现了
一、专业名词介绍
①OpenApi
是什么?
解答:OpenApi
是一个用于描述、定义和共享 RESTful API
文档的规范。最新规范是 OpenAPI 3.0
② Swagger
是什么?
解答: Swagger
是一个用于设计和测试 RESTful APIs
的工具。
它提供了API
描述、请求和响应示例、API
测试和文档生成等丰富的功能。最新版本是Swagger3
,支持OpenAPI3.0
规范
③ SpringFox
是什么?
SpringFox
是 Spring 社区维护的一个项目(非官方),帮助使用者将 Swagger 2 集成到 Spring 中。
目前国内项目使用的都是它
github地址:https://github.com/springfox/springfox
④springDoc
是什么?
解答: Spring-doc
也是 Spring 社区维护的一个项目(非官方),帮助使用者将 Swagger 3 集成到 Spring 中
SpringDoc
支持 Swagger
页面 Oauth2
登录,相较于 SpringFox
而言,它的支撑时间更长,无疑是更好的选择。
但是在国内发展较慢,网上一找资料,出来的基本上是 Swagger2
的内容。
⑤ OpenAPI
、Spring-doc
和 Swagger
之间的关系
解答:OpenAPI
定义了一种标准的格式来表示 API
文档,而 Swagger
是一个实现 OpenAPI
规范的工具
二、Swagger详细简介
Swagger 江湖人称“丝袜哥”,是一个帮助程序员生成接口文档的利器。
只需要简单配置,就可以生成带有漂亮UI
界面的接口文档,而且编写的接口代码变了
接口文档随之也跟着变,做到了真正的解放双手。
官网https://swagger.io/
Swagger 优点
- 号称世界上最流行的
API
框架 Restful Api
文档在线自动生成器- 直接运行,支持在线测试
API
- 不仅仅支持Java,还支持多种语言(如:
PHP
、Python
、Node.js
等)
三、小试牛刀
说了这么多Swagger 的优点,接下来就小试牛刀,看看怎么将Swagger集成到SpringBoot
中。
3.1、环境介绍
JDK:17
SpringBoot:3.3.0
Springdoc
注: 细心的小伙伴可能已经发现了,在springboot3.0
之前我用的都是Springfox
来集成Swagger
管理我们的API
接口文档,
但是Springfox
已经停止更新了,我们使用的是SpringBoot3 +jdk17
的环境后,Spring
官网推荐了Springdoc
来整合swagger
3.2 新建一个springboot-web项目
3.3 添加依赖
由于篇幅原因,其他web项目相关依赖这里就不一一贴出来了。
第一个依赖是必须的,而且版本必须大于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
环境,原来swagger
的V2
和V3
都不能用了,小伙伴们一定更要注意这儿
如果引入上面错误的依赖,项目启动会报下面错误,这时候我们引入上面正确的依赖重新启动项目即可
3.4 编写HelloController
新建一个controller
包--->建立一个HelloController
类
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "hello";
}
}
我们在浏览器中输入“http://localhost:8080/hello” 后回车,出现如下界面,说明我们的hello开发成功了
3.5 访问swagger接口页面
注:我们这里采用的是openapi
,所以就不用像swagger
的V2
和v3
那样添加配置类了
浏览器直接输入:http://localhost:8080/swagger-ui/index.html 回车即可看到下面界面
整合swagger是不是很简单呢
四、修改接口
从上面截图中我们看到,我们在HelloController
中只定义了一个接口,但是前端UI
界面中出来个7种请求方式(GET
、PUT
、POST
、DELETE
、OPTIONS
、HEAD
、PATCH
)的接口,这是为什么呢?
解答:@RequestMapping("/hello")
我们接口中只是指定了访问地址,并没有指定请求方式
我们将注解修改成@RequestMapping(path = "/hello",method = RequestMethod.GET)
或者@GetMapping("/hello")
然后重启服务,我们看到界面上就只有一种请求方式的接口了
五、接口文档常用配置
5.1 配置访问路径
在application.yml
中可以自定义api-docs
和swagger-ui
的访问路径。当然了,如果没配置,默认就是下面路径
springdoc:
api-docs:
path: /v3/api-docs
swagger-ui:
path: /swagger-ui.html
5.2 配置接口文档基本信息
① 配置接口基本信息
新建一个config
包--->并在包下建立一个SpringDocConfig
配置类
② 配置接口文档基础信息
我们在配置类中添加如下代码,
@Configuration
public class SpringDocConfig {
@Bean
public OpenAPI openAPI() {
return new OpenAPI()
// 配置接口文档基本信息
.info(this.getApiInfo())
;
}
private Info getApiInfo() {
return new Info()
// 配置文档标题
.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")
// 配置版本号
.version("2.0");
}
}
前端页面访问接口文档页面后显示如下
② 配置接口servers信息
接口可能存在多环境,如开发环境、测试环境、生产环境等
我们可以通过@OpenAPIDefinition
配合servers
属性来配置不同环境,具体配置示例如下
@OpenAPIDefinition(
servers = {
@Server(description = "开发环境服务器", url = "http://localhost:8080"),
@Server(description = "测试环境服务器", url = "https://test.xiezhr.com")
}
)
@Configuration
public class SpringDocConfig {
//...
}
配置完成后,浏览器访问显示如下
③ 配置外部文档信息
有时候我们需要在在线接口文档中可以显示跳转到API的一些外部文档(比如 项目部署文档等)
这个时候我们可以通过@OpenAPIDefinition
配合 externalDocs
属性来配置外部文档
具体配置如下
@OpenAPIDefinition(
externalDocs = @ExternalDocumentation(
description = "项目编译部署说明",
url = "http://localhost:8080/deplay/readme.md"
)
)
@Configuration
public class SpringDocConfig {
//......
}
配置完后重启服务,浏览器访问接口文档,显示如下
SpringDocConfig
类完整配置代码如下
@OpenAPIDefinition(
servers = {
@Server(description = "开发环境服务器", url = "http://localhost:8080"),
@Server(description = "测试环境服务器", url = "https://test.xiezhr.com")
},
externalDocs = @ExternalDocumentation(
description = "项目编译部署说明",
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()
// 配置文档标题
.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")
// 配置版本号
.version("2.0");
}
}
配置完上面信息后,重启服务,浏览器访问:http://localhost:8080/v3/swagger-ui/index.html
5.3 配置扫描接口
应用场景:
有时候我们为了业务需要,我们建立了多个包下的接口,如admin包下的,common包下的接口,
为了安全起见,我们只允许接口文档中访问comm包下面的接口。
在不加任何配置的情况下,所以接口都会默认显示,具体如下
配置扫描接口包:
在application.yml
中可以自定义要扫描的接口包
springdoc:
packages-to-scan: com.xiezhr.swaggerdemo.common.controller
配置好之后重启服务,我们发现前台UI只显示了common包下面的接口了
5.4 配置接口文档开关
使用场景:
为了接口安全,我们一般需要在测试(test)环境或者开发(dev)环境中开启接口文档,而在生产(prod)环境中 关闭接口文档
这个应该怎么做呢?
这里涉及到SpringBoot
多环境配置,忘记的小伙伴可以翻一翻之前的文章。传送门:
我们创建三个配置文件,分别为
①
application-dev.yml
开发环境②
application-test.yml
测试环境③
application-prod.yml
生产环境
只需在①和②配置文件中添加如下配置
springdoc:
api-docs:
enabled: true
而③配置文件中添加
springdoc:
api-docs:
enabled: false
通过上面配置后,我们在开发和测试环境下:就能正常访问http://localhost:8080/v3/swagger-ui/index.html#/
而在生产环境下就无法访问,报如下错误
5.5 配置API分组
为了演示API分组,我们在controller
包下面再建立admin
包和common
包,包下分别添加AdminController
和CommonController
接口类,结构及代码如下
① 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";
}
}
在默认情况(没有分组)的情况下,所有包下接口都显示在一一个默认组下面,如/common/* 和/admin/* 访问路径下的接口都显示在一起,如下图所示
这时,如果/common/* 下的接口比较多,/admin/* 下的接口也比较多,界面上显示就很混乱
解决办法就是添加分组信息,我们在SpringDocConfig
配置类中添加如下代码,这样就把接口分为了"common通用模块组" 和"admin模块组" 两个组
@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();
}
重启服务,再访问http://localhost:8080/v3/swagger-ui/index.html 如下
5.6 配置接口信息
① @Tag
注解使用
对一个 operation 进行说明或定义的标签,用在类或方法上,也可以用在 @OpenAPIDefinition
中定义标签。
常用参数:
name
: 名称description
: 接口描述信息
示例:
用在类上
@RestController
@RequestMapping("/common")
@Tag(name = "公共接口", description = "公共接口")
public class CommonController {
//......
}
② @Operation
注解使用
用于说明方法用途,用在方法上。
参数:
summary
:方法概要,方法的一个简单介绍,建议 120 个字符内description
:方法描述,一般是很长的内容hidden
:是否隐藏
示例:
@GetMapping("/hello")
@Operation(summary = "hello接口", description = "hello接口描述" ,hidden = true)
public String hello(){
return "hello";
}
③ @Parameter
注解使用
用于说明方法参数,用在方法参数上。
参数:
name
:指定的参数名in
:参数位置,可选query
、header
、path
或cookie
,默认为空,表示忽略description
:参数描述required
:是否必填,默认为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;
}
前端页面查看
④ @ApiResponse
注解使用
用于说明一个响应信息,用在 @ApiResponses
中。
参数:
responseCode
:HTTP 响应码description
:描述
示例:
@GetMapping("/user/{id}")
@Operation(summary = "获取用户信息", description = "根据用户ID获取用户信息")
@ApiResponses(value ={
@ApiResponse(responseCode = "200", description = "请求成功"),
@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 = "根据用户ID获取用户信息")
@ApiResponses(value ={
@ApiResponse(responseCode = "200", description = "请求成功"),
@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;
}
}
重启后,浏览器访问http://localhost:8080/v3/swagger-ui/index.html 如下
5.7 配置实体信息
① 新建一个User
实体类
@Data
public class User {
private String name;
private Integer age;
private String email;
private String address;
}
② @Schema
标签使用
用于描述数据对象信息或数据对象属性,比如各种POJO
类及属性,用在类或类属性上。
参数:
name
:属性名称description
:属性描述required
:是否必须minLength
:字符最小长度maxLength
:字符最大长度
③使用示例:
@Data
@Schema(description = "用户实体类",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;
}
④ 浏览器访问:http://localhost:8080/v3/swagger-ui/index.html ,我们看到配置的实体信息显示出来了
六、接口调试
通过上面各种配置之后,我们的在线接口文档基本上生成得差不多了。接下来我们就来说说怎么使用在线接口文档进行接口测试
① 测试说明
在之前小节中我们开发了要给根据用户ID 获取用户信息的接口getUser
。我们现在要做的就是在前端UI界面中找到这个接口,
在开发环境下输入用户ID值,然后获取用户信息。
② 选择组信息
【获取用户信息】这个接口在,common通用模块组下面,所以我们第一步就要前端UI界面右上角选择这个组
② 选择开发环境
在Servers
下选择配置好的开发环境
③ 找到我们要测试的接口
④ 测试接口,获取响应数据
接口右边下三角箭头展开接口------>点击Try it out
输入参数:用户ID------> 点击【Execute】----->在Response body 中查看接口响应信息
七、添加请求头
很多时候我们接口都需要认证之后才能访问,这时候我们就需要接口调用的时候携带着Token
信息
示例:
我们通过@RequestHeader
注解 获取请求头中token
信息
@GetMapping("/index")
public String admin(@RequestHeader ("token") String token){
System.out.println("token>>>>>>>>>>>>>>>>>>>>>>>>"+token);
//token 验证
//.....各种业务逻辑
return "admin";
}
到此,本期内容就结束了,★,°:.☆( ̄▽ ̄)/$:.°★ 。 希望对您有所帮助
我们下期再见 ヾ(•ω•`)o (●'◡'●)
SpringBoot3整合SpringDoc实现在线接口文档的更多相关文章
- 使用swagger实现web api在线接口文档
一.前言 通常我们的项目会包含许多对外的接口,这些接口都需要文档化,标准的接口描述文档需要描述接口的地址.参数.返回值.备注等等:像我们以前的做法是写在word/excel,通常是按模块划分,例如一个 ...
- .NET Core WEB API使用Swagger生成在线接口文档
1项目引用Swashbuckle.AspNetCore程序集和Microsoft.Extensions.PlatformAbstractions程序集 右击项目打开"管理NuGet程序包.. ...
- SpringBoot 使用Swagger2打造在线接口文档(附汉化教程)
原文地址: https://www.jianshu.com/p/7e543f0f0bd8 SpringBoot + Swagger2 UI界面-汉化教程 1.默认的英文界面UI 想必很多小伙伴都曾经使 ...
- 使用swagger实现web api在线接口文档(转载)
一.前言 通常我们的项目会包含许多对外的接口,这些接口都需要文档化,标准的接口描述文档需要描述接口的地址.参数.返回值.备注等等:像我们以前的做法是写在word/excel,通常是按模块划分,例如一个 ...
- 第05章—Swagger2打造在线接口文档
spring boot 系列学习记录:http://www.cnblogs.com/jinxiaohang/p/8111057.html 码云源码地址:https://gitee.com/jinxia ...
- springboot项目利用Swagger2生成在线接口文档
Swagger简介. Swagger2是一款restful接口文档在线生成和在线调试工具.很多项目团队利用Swagger自动生成接口文档,保证接口文档和代码同步更新.在线调试.简单地说,你可以利用这个 ...
- net core Webapi基础工程搭建(三)——在线接口文档Swagger
目录 前言 Swagger NuGet引用第三方类库 别急,还有 没错,注释 小结 前言 前后分离的好处,就是后端埋头做业务逻辑功能,不需要过多考虑用户体验,只专注于数据.性能开发,对于前端需要的数据 ...
- 从零开始的SpringBoot项目 ( 五 ) 整合 Swagger 实现在线API文档的功能
综合概述 spring-boot作为当前最为流行的Java web开发脚手架,越来越多的开发者选择用其来构建企业级的RESTFul API接口.这些接口不但会服务于传统的web端(b/s),也会服务于 ...
- spring boot 2.x 系列——spring-boot 集成 Swagger2 打造在线接口文档
文章目录 一.Springfox 与 Swagger 简介 1.1 Springfox 1.2 Swagger 1.3 OpenApi.Swagger.Springfox的关系 二.spring bo ...
- 使用ASP.NET Web API Help Pages 创建在线接口文档
操作步骤 1.新建Web API项目 2.在项目Areas文件夹下找到以下文件,取消注释图中代码. 3.右键解决方案,属性,如图设置. 4.运行程序,点击右上角API 接口列表: 详情-无参数: 详情 ...
随机推荐
- VMware虚拟机安装Centos-7.9
VMware虚拟机安装Centos-7.9 创作不易,点赞关注一下吧 1.安装VMware Workstation Pro 大家根据自己的实际情况安装合适版本的VMware Workstation P ...
- sqli-labs-master 第一关
Sql注入 基础知识: 一··系统函数; 1. version()--MySQL 版本 2. user()--数据库用户名 3. database()--数据库名 4. @@datadir--数据库路 ...
- C#库dll配置文件App.config数据库连接项connectionStrings
原文地址:https://www.zhaimaojun.top/Note/5464967 网上一大堆的都是在说怎么修改项目文件,试过了不行,因为里面涉及到vs版本和安装目录等问题,不同的设备配置是不同 ...
- go 操作elasticsearch
olivere/elastic 包 github.com/olivere/elastic doc: https://pkg.go.dev/github.com/olivere/elastic?utm_ ...
- 2019年最新前端面试题,js程序设计题
都说机会是留给有准备的人的. 一年之计在于春,面对众多的前端技术,需要时刻充电自己. 我现在整理一些前端js面试程序题. 1.判断一个字符串中出现最多的字符,并计算出现的次数? 2.用css伪类实现下 ...
- MSP 通过 Splashtop SOS 远程支持非托管设备
RMM 是 MSP 的绝佳工具.它们使 MSP 可以通过集中控制台来管理其所有客户计算机,通常使他们能够远程访问任何计算机以提供远程支持. 但是,这样做的一个很大限制是--并非所有客户设备都在 MSP ...
- C 语言编程 — 编程实践
目录 文章目录 目录 前文列表 程序示例 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基本语法> <C 语言编程 - 基本数据类型> < ...
- 推荐一款微信公众平台Python开发神器!
1.引言 在当今数字化时代,微信公众平台成为了企业和个人连接用户的重要渠道.为了高效地管理和与用户互动,开发者需要一个强大而灵活的工具. Weixin-Python 正是这样一个为微信公众平台量身打造 ...
- kubernets之横向伸缩pod与集群节点
一 pod的自动伸缩容的应用背景 在面对负载并发过高的时候,我们或许希望能够提高RS,RC以及Deployment等的replicas的参数来增加pod的cpu,mem等,或者是通过提高每个容器的r ...
- 使用docker 5分钟搭建一个博客(mysql+WordPress)
目录 一.系统环境 二.前言 三.搭建博客 3.1 创建wordpress和mysql容器 3.2 在wordpress界面设置个人博客信息 3.3 WordPress容器创建命令的简化版本 一.系统 ...