Spring Boot用Swagger生成Web API文档详解
高质量的 API 文档在系统开发的过程中非常重要。Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务,是非常流行的 API 表达工具。
我们知道,RESTful API 可能要面对多个开发人员或多个开发团队,涉及不同平台,包括 iOS、Android 或 Web 前端等。为了降低与其他团队频繁沟通的成本,一般我们会创建一份统一的 API 说明文档来记录所有接口的使用说明。
然而,普通的 API 文档存在以下问题:
1) 由于接口众多,并且细节复杂(需要考虑不同的 HTTP 请求类型、HTTP 头部信息、HTTP 请求内容等),创建这样一份高质量的文档是一件非常烦琐的工作。
2) 随着需求的不断变化,接口文档必须同步修改,就很容易出现文档和业务不一致的情况。
为了解决这些问题,Swagger 应运而生,它能够自动生成完善的 RESTful API 文档,并根据后台代码的修改同步更新。这样既可以减少维护接口文档的工作量,又能将说明内容集成到实现代码中,让维护文档和修改代码合为一体,实现代码逻辑与说明文档的同步更新。另外,Swagger 也提供了完整的测试页面来调试 API,让 API 测试变得轻松、简单。
下面就以之前的用户管理模块接口为例来感受 Swagger 的魅力。
apiInfo 主要配置 Swagger2 文档网站的信息,比如网站的标题、网站的描述、使用的协议等。
需要注意的是:

图 1 Swagger-UI启动页面
Swagger 自动将用户管理模块的全部接口信息展现出来,包括接口功能说明、调用方式、请求参数、返回数据结构等信息。
在 Swagger 页面上,我们发现每个接口描述右侧都有一个按钮 try it out,单击 try it out 按钮即可调用该接口进行测试。如下图所示:

图 2 Swagger接口验证测试
在获取人员信息的接口上单击 try it out 按钮,输入 userId 的请求参数“2001”,单击 Execute 按钮就会将请求发送到后台,从而进行接口验证测试。
其实非常简单,修改 Swagger2Config 配置类,利用 ParameterBuilder 构成请求参数。具体示例代码如下:
完成之后重新启动应用,再次查看接口,如下图所示:

图 3 添加token参数
我们可以看到接口参数中已经支持发送 token 请求参数。
人员管理模块中的所有 API 都统一加上了 token 参数,调用时 Swagger 会将 token 参数自动加入 HTTP 的请求头。
表:Swagger常用注解说明
在实际项目中,Swagger 除了提供 @ApiImplicitParams 注解描述简单的参数之外,还提供了用于对象参数的 @ApiModel 和 @ApiModelProperty 两个注解,用于封装的对象作为传入参数或返回数据:
以上是在项目中常用的一些注解,利用这些注解就可以构建出清晰的 API 文档。
我们知道,RESTful API 可能要面对多个开发人员或多个开发团队,涉及不同平台,包括 iOS、Android 或 Web 前端等。为了降低与其他团队频繁沟通的成本,一般我们会创建一份统一的 API 说明文档来记录所有接口的使用说明。
然而,普通的 API 文档存在以下问题:
1) 由于接口众多,并且细节复杂(需要考虑不同的 HTTP 请求类型、HTTP 头部信息、HTTP 请求内容等),创建这样一份高质量的文档是一件非常烦琐的工作。
2) 随着需求的不断变化,接口文档必须同步修改,就很容易出现文档和业务不一致的情况。
为了解决这些问题,Swagger 应运而生,它能够自动生成完善的 RESTful API 文档,并根据后台代码的修改同步更新。这样既可以减少维护接口文档的工作量,又能将说明内容集成到实现代码中,让维护文档和修改代码合为一体,实现代码逻辑与说明文档的同步更新。另外,Swagger 也提供了完整的测试页面来调试 API,让 API 测试变得轻松、简单。
用Swagger生成Web API文档
在 Spring Boot 项目中集成 Swagger 同样非常简单,只需在项目中引入 springfox-swagger2 和 springfox-swagger-ui 依赖即可。下面就以之前的用户管理模块接口为例来感受 Swagger 的魅力。
1) 配置Swagger的依赖
<!-- swagger2 依赖配置--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.8.0</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.8.0</version> </dependency>在上面的示例中,在项目 pom.xml 配置文件中引入了 springfox-swagger2 和 springfox-swagger-ui 两个依赖包。其中 swagger2 是主要的文档生成组件,swagger-ui 为页面显示组件。
2) 创建Swagger2配置类
@Configuration @EnableSwagger2 public class Swagger2Config implements WebMvcConfigurer { @Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("com.weiz.example01.controller")) .paths(PathSelectors.any()) .build(); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("Spring Boot中使用Swagger2构建RESTful APIs") .description("Spring Boot相关文章请关注:https://www.cnblogs.com/zhangweizhong") .termsOfServiceUrl("https://www.cnblogs.com/zhangweizhong") .contact("架构师精进") .version("1.0") .build(); } /** * swagger增加url映射 * @param registry */ @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("swagger-ui.html") .addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**") .addResourceLocations("classpath:/META-INF/resources/webjars/"); } }在上面的示例中,我们在 SwaggerConfig 的类上添加了 @Configuration 和 @EnableSwagger2 两个注解。
- @Configuration 注解让 Spring Boot 来加载该类配置;
- @EnableSwagger2 注解启用 Swagger2,通过配置一个 Docket Bean,来配置映射路径和要扫描的接口所在的位置。
apiInfo 主要配置 Swagger2 文档网站的信息,比如网站的标题、网站的描述、使用的协议等。
需要注意的是:
- basePackage 可以在 SwaggerConfig 中配置 com.weiz.example01.controller,也可以在启动器 ComponentScan 中配置;
- 需要在 SwaggerConfig 中配置 Swagger 的 URL 映射地址:/swagger-ui.html。
3) 添加文档说明内容
上面的配置完成之后,接下来需要在 API 上增加内容说明。我们直接在之前的用户管理模块的 UserController 中增加相应的接口内容说明,代码如下:@Api(tags = {"用户接口"}) @RestController public class UserController { @ApiOperation(value="创建用户", notes="根据User对象创建用户") @PostMapping(value = "user") public JSONResult save(@RequestBody User user){ System.out.println("用户创建成功:"+user.getName()); return JSONResult.ok(201,"用户创建成功"); } @ApiOperation(value="更新用户详细信息", notes="根据id来指定更新对象,并根据传过来的user信息来更新用户详细信息") @PutMapping(value = "user") public JSONResult update(@RequestBody User user) { System.out.println("用户修改成功:"+user.getName()); return JSONResult.ok(203,"用户修改成功"); } @ApiOperation(value="删除用户", notes="根据url的id来指定删除对象") @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "Long", paramType = "query") @DeleteMapping("user/{userId}") public JSONResult delete(@PathVariable String userId) { System.out.println("用户删除成功:"+userId); return JSONResult.ok(204,"用户删除成功"); } @ApiOperation(value="查询用户",notes = "通过用户ID获取用户信息") @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "Long", paramType = "query") @GetMapping("user/{userId}") public JSONResult queryUserById(@PathVariable String userId) { User user =new User(); user.setUserId(userId); user.setName("weiz"); user.setAge(20); System.out.println("获取用户成功:"+userId); return JSONResult.ok(200,"获取用户成功",user); } }在上面的示例中,主要为 UserController 中的接口增加了接口信息描述,包括接口的用途、请求参数说明等:
- @Api注解:用来给整个控制器(Controller)增加说明;
- @ApiOperation注解:用来给各个API方法增加说明;
- @ApiImplicitParams、@ApiImplicitParam注解:用来给参数增加说明。
4) 查看生成的API文档
完成上面的配置和代码修改之后,Swagger 2 就集成到 Spring Boot 项目中了。接下来启动项目,在浏览器中访问 http://localhost:8080/swagger-ui.html,Swagger 会自动构建接口说明文档,如下图所示:
图 1 Swagger-UI启动页面
Swagger 自动将用户管理模块的全部接口信息展现出来,包括接口功能说明、调用方式、请求参数、返回数据结构等信息。
在 Swagger 页面上,我们发现每个接口描述右侧都有一个按钮 try it out,单击 try it out 按钮即可调用该接口进行测试。如下图所示:

图 2 Swagger接口验证测试
在获取人员信息的接口上单击 try it out 按钮,输入 userId 的请求参数“2001”,单击 Execute 按钮就会将请求发送到后台,从而进行接口验证测试。
为Swagger添加token参数
很多时候,客户端在调用 API 时需要在 HTTP 的请求头携带通用参数,比如权限验证的 token 参数等。但是 Swagger 是怎么描述此类参数的呢?接下来通过示例演示如何为 Swagger 添加固定的请求参数。其实非常简单,修改 Swagger2Config 配置类,利用 ParameterBuilder 构成请求参数。具体示例代码如下:
@@Configuration @EnableSwagger2 public class Swagger2Config implements WebMvcConfigurer { @Bean public Docket createRestApi() { // 添加请求参数,这里把token作为请求头参数传入后端 ParameterBuilder parameterBuilder = new ParameterBuilder(); List<Parameter> parameters = new ArrayList<Parameter>(); parameterBuilder.name("token").description("token令牌") .modelRef(new ModelRef("string")).parameterType("header").required(false).build(); parameters.add(parameterBuilder.build()); return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("com.weiz.example01.controller")) .paths(PathSelectors.any()) .build() .globalOperationParameters(parameters); } … }在上面的示例中,通过 ParameterBuilder 类把 token 作为全局统一的参数添加到 HTTP 的请求头中。系统所有的 API 都会统一加上此参数。
完成之后重新启动应用,再次查看接口,如下图所示:

图 3 添加token参数
我们可以看到接口参数中已经支持发送 token 请求参数。
人员管理模块中的所有 API 都统一加上了 token 参数,调用时 Swagger 会将 token 参数自动加入 HTTP 的请求头。
Swagger常用注解
Swagger 提供了一系列注解来描述接口信息,包括接口说明、请求方法、请求参数、返回信息等,常用注解如下表所示。表:Swagger常用注解说明
注解 | 属性 | 值类型 | 说明 | 示例 |
---|---|---|---|---|
@Api | value | 字符串 | 可用在 class 头上,class 描述 | @Api(value = "xxx", description = "xxx") |
description | 字符串 | |||
@ApiOperation | value | 字符串 | 可用在方法头上,参数的描述容器 | @ApiOperation(value = "xxx", notes = "xxx") |
notes | 字符串 | |||
@ApiImplicitParams | @ApiImplicitParam 数组 | 可用在方法头上,参数的描述容器 | @ApiImplicitParams({@ApiImplicitParam1,@ApiImplicitParam2,...}) | |
@ApiImplicitParam | name | 字符串,与参数命名对应 | 可用在 @ApiImplicitParams 中 | 用例参见项目中的设置 |
value | 字符串 | 参数中文描述 | ||
required | 布尔值 | true / false | ||
dataType | 字符串 | 参数类型 | ||
paramType | 字符串 | 参数请求方式:query / path | ||
defaultValue | 字符串 | 在 API 测试中的默认值 | ||
@ApiResponses | {} | @ApiResponse 数组 | 可用在方法头上,参数的描述容器 | @ApiResponses({@ApiResponse1,@ApiResponse2,...}) |
@ApiResponse | code | 整数 | 可用在 @ApiResponses 中 | @ApiResponse(code = 200, message = "Successful") |
message | 字符串 | 错误描述 | ||
@ApiIgnore | 忽略这个 API | |||
@ApiError | 发生错误的返回信息 |
在实际项目中,Swagger 除了提供 @ApiImplicitParams 注解描述简单的参数之外,还提供了用于对象参数的 @ApiModel 和 @ApiModelProperty 两个注解,用于封装的对象作为传入参数或返回数据:
- @ApiModel 负责描述对象的信息;
- @ApiModelProperty 负责描述对象中属性的相关内容。
以上是在项目中常用的一些注解,利用这些注解就可以构建出清晰的 API 文档。