
Swagger 是一个用于生成、描述和调用 RESTful 接口的 Web 服务。通俗的来讲,Swagger 就是将项目中所有(想要暴露的)接口展现在页面上,并且可以进行接口调用和测试的服务。
学习目标:
- 了解Swagger的概念及作用
- 掌握在项目中集成Swagger自动生成API文档
简介
前后端分离
- 前端 -> 前端控制层、视图层
- 后端 -> 后端控制层、服务层、数据访问层
- 前后端通过API进行交互
- 前后端相对独立且松耦合
产生的问题
- 前后端集成,前端或者后端无法做到“及时协商,尽早解决”,最终导致问题集中爆发
解决方案
- 首先定义schema [ 计划的提纲 ],并实时跟踪最新的API,降低集成风险
Swagger
- 号称世界上最流行的API框架
- Restful Api 文档在线自动生成器 => API 文档 与API 定义同步更新
- 直接运行,在线测试API
- 支持多种语言 (如:Java,PHP等)
- 官网:https://swagger.io/
SpringBoot集成
步骤
1、新建一个SpringBoot-web项目
2、添加Maven依赖
要求:jdk 1.8 + 否则swagger2无法运行
1 |
<!--swagger--> |
3、编写Bean、Controller进行测试,确保运行成功!
4、要使用Swagger,我们需要编写一个配置类-SwaggerConfig来配置 Swagger
1 |
//配置类 |
5、访问测试 :http://localhost:8080/swagger-ui.html
,可以看到swagger的界面(具体端口号,得看SpringBoot配置文件中的server.port
)
配置ApiInfo
1、Swagger实例Bean是Docket,所以通过配置Docket实例来配置Swaggger。构建Docket实例时通过apiInfo()方法配置“swagger信息”(见上图)。
1 |
//配置docket以配置Swagger具体参数 |
2、通过自定义方法myApiInfo()来配置文档信息
1 |
//配置文档信息 |
3、Docket 实例关联上 apiInfo配置。对上边的docket()方法进行如下修改:
1 |
|
4、重启项目,访问测试 http://localhost:8080/swagger-ui.html 看下效果(注意看“swagger信息”部分)
配置扫描接口
关于实体类的扫描,注意:只要这个实体类在接口的返回值上,就会被自动扫描不需要手动配置。
1、构建Docket时通过select()方法配置怎么扫描接口。
1 |
构建Docket实例 |
apis()
2、使用.apis()
来指定要扫描的接口,参数RequestHandlerSelectors指定具体规则。
1 |
|
3、参数RequestHandlerSelectors用法:
1 |
// 扫描所有,项目中的所有接口都会被扫描到 |
paths()
4、使用.paths()
配置 接口扫描 过滤规则,参数PathSelectors指定具体规则。
1 |
|
5、参数PathSelectors用法:
1 |
.any() // 任何请求都扫描 |
.ant
,针对路径来进行控制.ant("/kuang/**")
,双*代表路径,单*代表文件。即双*包含后边的下级目录,单*仅包含当前目录下的文件
.regex
,通过正则表达式控制,可以设置前缀、后缀等特殊要求.regex("^/nazox_demo/v1/store.*")
,表示匹配以字符/nazox_demo/v1/store
开头的路径
案例
在上边“配置ApiInfo”的基础上,对docket()进行如下修改:(.apiInfo()后边添加select()等扫描规则)
1 |
//配置docket以配置Swagger具体参数 |
重启项目,访问测试 http://localhost:8080/swagger-ui.html 看下效果(注意看“接口信息”部分,error相关的接口将不会再被扫描出来)
配置是否启用
1、使用.enable()
配置 是否启用swagger。默认启用,若要禁用swagger在创建Docket实例时,添加.enable(false)
即可。
1 |
//配置docket以配置Swagger具体参数 |
2、如何动态配置
思路一:在配置文件application.properties中添加一个配置项,在swagger的配置类中使用注解@Value获取该值并绑定到enable()中。是否启用swagger只需要修改该配置项即可,也可在使用命令行方式启动项目时修改该配置项的值,选择是否启用swagger。
思路二:项目中使用多个配置文件,根据项目运行环境(使用了什么配置文件)来确定是否启用swagger。
案例(思路二):当项目处于test、dev环境(测试、开发)时启用swagger,处于prod(生产环境)时不启用。见第3-7行代码、第14行代码:
1 |
//配置docket以配置Swagger具体参数 |
3、可以在项目中增加一个dev的配置文件查看效果!
配置API分组
1、如果没有配置分组,默认是default。通过groupName()方法即可配置分组:
1 |
|
2、如何配置多个分组?配置多个分组只需要配置多个docket即可:
1 |
|
3、案例。
1 |
//配置docket以配置Swagger具体参数 |
重启项目查看即可:
配置实体类
1、新建一个实体类
1 |
"用户实体") ( |
2、只要这个实体在请求接口的返回值上(即使是泛型),都能映射到实体项中:
1 |
"/getUser") ( |
3、重启查看测试
注:并不是因为@ApiModel这个注解让实体显示在这里了,而是只要出现在接口方法的返回值上的实体都会显示在这里,而@ApiModel和@ApiModelProperty这两个注解只是为实体添加注释的。
@ApiModel为类添加注释
@ApiModelProperty为类属性添加注释
常用注解
Swagger的所有注解定义在io.swagger.annotations包下。
下面列一些经常用到的,未列举出来的可以另行查阅说明:
Swagger注解 | 简单说明 |
---|---|
@Api(tags = “xxx模块说明”) | 作用在模块类上(例如:Controller模块) |
@ApiOperation(“xxx接口说明”) | 作用在接口方法上(例如Controller模块中的具体某个接口/方法) |
@ApiModel(“xxxPOJO说明”) | 作用在模型类上(例如:视图对象VO、实体类Bean、请求对象QO等) |
@ApiModelProperty(value = “xxx属性说明”,hidden = true) | 作用在类方法和属性上,hidden设置为true可以隐藏该属性(一般在使用了@ApiModel的类中使用) |
@ApiParam(“xxx参数说明”) | 作用在参数、方法和字段上,类似@ApiModelProperty(一般在使用了@ApiOperation的方法的形参中使用) |
示例:给controller模块和内部的接口添加注释
1 |
/** |
这样的话,可以给一些比较难理解的属性或者接口,增加一些配置信息,让人更容易阅读!
相较于传统的Postman或Curl方式测试接口,使用swagger简直就是傻瓜式操作,不需要额外说明文档(写得好本身就是文档)而且更不容易出错,只需要录入数据然后点击Execute,如果再配合自动化框架,可以说基本就不需要人为操作了。
Swagger是个优秀的工具,现在国内已经有很多的中小型互联网公司都在使用它,相较于传统的要先出Word接口文档再测试的方式,显然这样也更符合现在的快速迭代开发行情。当然了,提醒下大家在正式环境要记得关闭Swagger,一来出于安全考虑二来也可以节省运行时内存。
拓展:其他皮肤
我们可以导入不同的包实现不同的皮肤定义:(mg-ui比较好)
1、默认的 访问 http://localhost:8080/swagger-ui.html
1 |
<dependency> |
2、bootstrap-ui 访问 http://localhost:8080/doc.html
1 |
<!-- 引入swagger-bootstrap-ui包 /doc.html--> |
3、Layui-ui 访问 http://localhost:8080/docs.html
1 |
<!-- 引入swagger-ui-layer包 /docs.html--> |
4、mg-ui 访问 http://localhost:8080/document.html
1 |
<!-- 引入swagger-ui-layer包 /document.html--> |
Tips
- 使用swagger后,将注释写在swagger的注解中就不需要在方法外再写注释了
- 接口返回数据,建议使用视图对象(当然视图对象VO也是要添加swagger注解,给类和类属性添加注释)这样swagger-ui页面的响应model才会正常显示,而不是跟上边的示例那样返回String。
视图对象的使用,示例:
1、创建视图对象DataVo(根据前后端约定好的规则来设计视图对象)
1 |
package com.qsdbl.xxx.entity.vo; |
2、将上边的示例,返回String改为返回视图对象
1 |
"分页查询入库单数据") ( |
3、效果。注意看下边的“响应Model”部分(截图不是接口“分页查询入库单数据”,但是效果是相同的)。
问题
无法访问swagger-ui页面,可尝试在SpringBoot的启动类中添加注解@EnableSwagger2
笔记来源:B站狂神说