## 一、为什么要发布API接口文档
当下很多公司都采取前后端分离的开发模式,前端和后端的工作由不同的工程师完成。在这种开发模式下,维护一份及时更新且完整的API 文档将会极大的提高我们的工作效率。传统意义上的文档都是后端开发人员使用word编写的,相信大家也都知道这种方式很难保证文档的及时性,这种文档久而久之也就会失去其参考意义,反而还会加大我们的沟通成本。而 Swagger 给我们提供了一个全新的维护 API 文档的方式,下面我们就来了解一下它的优点:
* 代码变,文档变。只需要少量的注解,Swagger 就可以根据代码自动生成 API 文档,很好的保证了文档的时效性。
* 跨语言性,支持 40 多种语言。
* Swagger UI 呈现出来的是一份可交互式的 API 文档,我们可以直接在文档页面尝试 API 的调用,省去了准备复杂的调用参数的过程。
* 还可以将文档规范导入相关的工具(例如 SoapUI), 这些工具将会为我们自动地创建自动化测试。
## 二、整合swagger2生成文档
网上有一些国内的开发者开发的`spring-boot-starter-swagger`,这个实际上不是swagger官方开发的,但是我尝试用过,实际用起来还不错。有小伙伴告诉我文章中更新为这个,由于我不能保证这个`spring-boot-starter-swagger`开发者的持续版本测试及更新能力,所以我就不为大家介绍这种了。大家如果喜欢用这个,可以自行去学习(和本文介绍的内容大同小异)。但是记住这不是官方提供的集成方案。
> 另外说一点,如果是个人开发的应该叫做:`swagger-xxxx-spring-boot-starter`,官方提供的才能命名为:`spring-boot-starter-swagger`。虽然这不是硬性要求,但这是spring boot官方建议开发者普遍遵循的规范。大家在自己开发spring boot应用集成包的时候要注意这点,不要给他人造成误导!
首先通过maven坐标引入swagger相关的类库。
~~~
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.6.1</version>
</dependency>
~~~
然后通过java Config对Swagger2进行配置。
~~~
@Configuration
@EnableSwagger2
public class Swagger2 {
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("springboot利用swagger构建api文档")
.description("简单优雅的restfun风格")
.termsOfServiceUrl("http://www.zimug.com")
.version("1.0")
.build();
}
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
//扫描basePackage包下面的“/rest/”路径下的内容作为接口文档构建的目标
.apis(RequestHandlerSelectors.basePackage("com.zimug.bootlaunch"))
.paths(PathSelectors.regex("/rest/.*"))
.build();
}
}
~~~
* @EnableSwagger2 注解表示开启SwaggerAPI文档相关的功能
* 在apiInfo方法中配置接口文档的title(标题)、描述、termsOfServiceUrl(服务协议)、版本等相关信息
* 在createRestApi方法中,basePackage表示扫描哪个package下面的Controller类作为API接口文档内容范围
* 在createRestApi方法中,paths表示哪一个请求路径下控制器映射方法,作为API接口文档内容范围
集成完成之后,做一下访问验证:[http://localhost:8888/swagger-ui.html](http://localhost:8888/swagger-ui.html),如下:
![](https://img.kancloud.cn/83/fe/83fe3522baf38ff104fd97679ad9328f_1447x448.png)
swagger不仅提供了静态的接口文档的展示,还提供了执行接口方法测试的功能。在下图中填入接口对应的参数,点击“try it out"就可以实现接口请求的发送与响应结果的展示。
![](https://img.kancloud.cn/28/ec/28ecd55ec166fadb71e7d5da3f584924_1387x543.png)
## 三、书写swagger注解
通常情况下Controller类及方法书写了swagger注解,就不需要写java注释了。但是笔者从来几乎都不写swagger注解,也就是说本小节(三、书写swagger注解)所讲的内容笔者从来都不用。因为一个成熟的团队,前端人员根据英文方法的名称和参数名称就能知道方法的作用,前提是代码开发者认真的为接口及参数起英文名。通过团队内推广RESTful接口的设计原则和良好的统一的交互规范(本专栏之前已经介绍过),就能知道响应结果的含义。这也是一种“约定大于配置”的体现。
当然,如果你的团队没有“约定“,那么就需要“配置”来做文档说明。我通常把这个过程叫做“为接口功能添加注释”。写法如下:
~~~
@ApiOperation(value = "添加文章", notes = "添加新的文章", tags = "Article",httpMethod = "POST")
@ApiImplicitParams({
@ApiImplicitParam(name = "title", value = "文章标题", required = true, dataType = "String"),
@ApiImplicitParam(name = "content", value = "文章内容", required = true, dataType = "String"),
@ApiImplicitParam(name = "author", value = "文章作者", required = true, dataType = "String")
})
@ApiResponses({
@ApiResponse(code=200,message="成功",response=AjaxResponse.class),
})
@PostMapping("/article")
public @ResponseBody AjaxResponse saveArticle(
@RequestParam(value="title") String title, //参数1
@RequestParam(value="content") String content,//参数2
@RequestParam(value="author") String author,//参数3
) {
~~~
swagger注释添加完成之后,接口文档变成如下的样子(含有中文说明):
![](https://img.kancloud.cn/ef/27/ef2785b076d877a02fb3b8ff828ccd6b_989x881.png)
ApiModel注解的用法
~~~
@ApiModel(value = "通用响应数据结构类")
public class AjaxResponse {
@ApiModelProperty(value="请求是否处理成功")
private boolean isok; //请求是否处理成功
@ApiModelProperty(value="请求响应状态码",example="200、400、500")
private int code; //请求响应状态码(200、400、500)
@ApiModelProperty(value="请求结果描述信息")
private String message; //请求结果描述信息
@ApiModelProperty(value="请求结果数据")
private Object data; //请求结果数据(通常用于查询操作)
}
~~~
页面显示结果
![](https://img.kancloud.cn/a6/c7/a6c7b194934e9a4f30ab22847604fe38_327x162.png)
虽然笔者自己从来都不写swagger注解,但不排除有的团队觉得可以用,所以还是详细介绍一下:
~~~
@Api:用在Controller控制器类上
属性tags="说明该类的功能及作用"
@ApiOperation:用在Controller控制器类的请求的方法上
value="说明方法的用途、作用"
notes="方法的备注说明"
@ApiImplicitParams:用在请求的方法上,表示一组参数说明
@ApiImplicitParam:请求方法中参数的说明
name:参数名
value:参数的汉字说明、解释、用途
required:参数是否必须传,布尔类型
paramType:参数的类型,即参数存储位置或提交方式
· header --> Http的Header携带的参数的获取:@RequestHeader
· query --> 请求参数的获取:@RequestParam (如上面的例子)
· path(用于restful接口)--> 请求参数的获取:@PathVariable
· body(不常用)
· form(不常用)
dataType:参数类型,默认String,其它值dataType="Integer"
defaultValue:参数的默认值
@ApiResponses:用在控制器的请求的方法上,对方法的响应结果进行描述
@ApiResponse:用于表达一个响应信息
code:数字,例如400
message:信息,例如"请求参数没填好"
response:响应结果封装类,如上例子中的AjaxResponse.class
@ApiModel:value=“通常用在描述@RequestBody和@ResponseBody注解修饰的接收参数或响应参数实体类”
@ApiModelProperty:value="实体类属性的描述"
~~~
## 四、生产环境下如何禁用swagger2
我们的文档通常是在团队内部观看及使用的,不希望发布到生产环境让用户看到。
* 禁用方法1:使用注解@Profile({"dev","test"}) 表示在开发或测试环境开启,而在生产关闭。(推荐使用,如果你不了解Profile是什么,本专栏后面的章节将有介绍,您也可以先自己了解一下)
* 禁用方法2:使用注解@ConditionalOnProperty(name = "swagger.enable", havingValue = "true") 然后在测试配置或者开发配置中 添加 swagger.enable = true 即可开启,生产环境不填则默认关闭Swagger.
更多使用细节可以参考:
[https://www.ibm.com/developerworks/cn/java/j-using-swagger-in-a-spring-boot-project/index.html](https://www.ibm.com/developerworks/cn/java/j-using-swagger-in-a-spring-boot-project/index.html)
- 内容简介
- 第一章 Spring boot 简介
- 1.1 helloworld
- 1.2 提高开发效率工具lombok
- 1.3 IDEA热部署
- 1.4 IDEA常用插件
- 1.5 常用注解
- 第二章 RESTful接口
- 2.1 RESTful风格API
- 2.1.1 spring常用注解开发RESTful接口
- 2.1.2 HTTP协议与Spring参数接收注解
- 2.1.3 Spring请求处理流程注解
- 2.2 JSON数据格式处理
- 2.2.1 Jackson的转换示例代码
- 2.3 针对接口编写测试代码
- 2.3.1 编码接口测试示例代码
- 2.3.2 带severlet容器的接口测试示例代码
- 2.3.3 Mockito测试示例代码
- 2.3.4 Mockito轻量测试
- 2.4 使用swagger2构建API文档
- 2.4.1 swagger2示例代码
- 2.4.2 pom.xml
- 2.5 使用swagger2导出各种格式的接口文档
- 第三章 sping boot配置管理
- 3.1 YAML语法
- 3.2 YAML绑定配置变量的方式
- 3.3 YAML配置属性值校验
- 3.4 YAML加载外部配置文件
- 3.5 SpEL表达式绑定配置项
- 3.6 不同环境下的多配置
- 3.7 配置文件的优先级
- 3.8 配置文件敏感字段加密
- 第四章 连接数据库使用到的框架
- 4.1 spring JDBC
- 4.2 mybatis配置mybatisgenerator自动生成代码
- 4.3 mybatis操作数据库+dozer整合Bean自动加载
- 4.4 spring boot mybatis 规范
- 4.5 spirng 事务与分布式事务
- 4.6 spring mybaits 多数据源(未在git版本中实现)
- 4.7 mybatis+atomikos实现分布式事务(未在git版本中实现)
- 4.8 mybatis踩坑之逆向工程导致的服务无法启动
- 4.9 Mybatis Plus
- 4.9.1.CURD快速入门
- 4.9.2.条件构造器使用与总结
- 4.9.3.自定义SQL
- 4.9.4.表格分页与下拉分页查询
- 4.9.5.ActiveRecord模式
- 4.9.6.主键生成策略
- 4.9.7.MybatisPlus代码生成器
- 4.9.8.逻辑删除
- 4.9.9.字段自动填充
- 4.9.10.多租户解决方案
- 4.9.11.雪花算法与精度丢失
- 第五章 页面展现整合
- 5.1 webjars与静态资源
- 5.2 模板引擎与未来趋势
- 5.3 整合JSP
- 5.4 整合Freemarker
- 5.5 整合Thymeleaf
- 5.6 Thymeleaf基础语法
- 5.7 Thymeleaf内置对象与工具类
- 5.8 Thymeleaf公共片段(标签)和内联JS
- 第六章 生命周期内的拦截、监听
- 6.1 servlet与filter与listener的实现
- 6.1.1 FilterRegistration
- 6.1.2 CustomFilter
- 6.1.3 Customlister
- 6.1.4 FirstServlet
- 6.2 spring拦截器及请求链路说明
- 6.2.1 MyWebMvcConfigurer
- 6.2.2 CustomHandlerInterceptor
- 6.3 自定义事件的发布与监听
- 6.4 应用启动的监听
- 第七章 嵌入式容器的配置与应用
- 7.1 嵌入式的容器配置与调整
- 7.2 切换到jetty&undertow容器
- 7.3 打war包部署到外置tomcat容器
- 第八章 统一全局异常处理
- 8.1 设计一个优秀的异常处理机制
- 8.2 自定义异常和相关数据结构
- 8.3 全局异常处理ExceptionHandler
- 8.3.1 HelloController
- 8.4 服务端数据校验与全局异常处理
- 8.5 AOP实现完美异常处理方案
- 第九章 日志框架与全局日志管理
- 9.1 日志框架的简介与选型
- 9.2 logback日志框架整合使用
- 9.3 log4j2日志框架整合与使用
- 9.4 拦截器实现用户统一访问日志
- 第十章 异步任务与定时任务
- 10.1 实现Async异步任务
- 10.2 为异步任务规划线程池
- 10.3 通过@Scheduled实现定时任务
- 10.4 quartz简单定时任务(内存持久化)
- 10.5 quartz动态定时任务(数据库持久化)
- 番外章节
- 1.windows下安装git
- 1 git的使用
- 2 idea通过git上传代码到github
- 2.maven配置
- 3.idea几个辅助插件
- 4.idea配置数据库
- 5.搭建外网穿透实现外网访问内网项目
- 6.idea设置修改页面自动刷新
- 7.本地tomcat启动乱码
- 8.win10桌面整理,得到一个整洁的桌面
- 9.//TODO的用法
- 10.navicat for mysql 工具激活
- 11.安装redis
- 12.idea修改内存
- 13.IDEA svn配置
- 14.IntelliJ IDEA像Eclipse一样打开多个项目