在应用开发过程中经常需要对其他应用或者客户端提供 RESTful API 接口,尤其是在版本快速迭代的开发过程中,修改接口的同时还需要同步修改对应的接口文档,这使我们总是做着重复的工作,并且如果忘记修改接口文档,就可能造成不必要的麻烦。
为了解决这些问题,Swagger 就孕育而生了,那让我们先简单了解下。
Swagger 简介
Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。
总体目标是使客户端和文件系统作为服务器,以同样的速度来更新。文件的方法、参数和模型紧密集成到服务器端的代码中,允许 API 始终保持同步。
下面我们在 Spring Boot 中集成 Swagger 来构建强大的接口文档。
Spring Boot 集成 Swagger
Spring Boot 集成 Swagger 主要分为以下三步:
- 加入 Swagger 依赖
- 加入 Swagger 文档配置
- 使用 Swagger 注解编写 API 文档
加入依赖
首先创建一个项目,在项目中加入 Swagger 依赖,项目依赖如下所示:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency>
加入配置
接下来在 config
包下创建一个 Swagger 配置类 Swagger2Configuration
,在配置类上加入注解 @EnableSwagger2
,表明开启 Swagger,注入一个 Docket 类来配置一些 API 相关信息,apiInfo()
方法内定义了几个文档信息,代码如下:
@Configuration @EnableSwagger2 public class Swagger2Configuration { @Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() // swagger 文档扫描的包 .apis(RequestHandlerSelectors.basePackage("com.wupx.interfacedoc.controller")) .paths(PathSelectors.any()) .build(); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("测试接口列表") .description("Swagger2 接口文档") .version("v1.0.0") .contact(new Contact("wupx", "https://www.tianheyu.top", "wupx@qq.com")) .license("Apache License, Version 2.0") .licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html") .build(); } }
列举其中几个文档信息说明下:
- title:接口文档的标题
- description:接口文档的详细描述
- termsOfServiceUrl:一般用于存放公司的地址
- version:API 文档的版本号
- contact:维护人、维护人 URL 以及 email
- license:许可证
- licenseUrl:许可证 URL
编写 API 文档
在 domain
包下创建一个 User
实体类,使用 @ApiModel
注解表明这是一个 Swagger 返回的实体,@ApiModelProperty
注解表明几个实体的属性,代码如下(其中 getter/setter 省略不显示):
@ApiModel(value = "用户", description = "用户实体类") public class User { @ApiModelProperty(value = "用户 id", hidden = true) private Long id; @ApiModelProperty(value = "用户姓名") private String name; @ApiModelProperty(value = "用户年龄") private String age; // getter/setter }
最后,在 controller
包下创建一个 UserController
类,提供用户 API 接口(未使用数据库),代码如下:
@RestController @RequestMapping("/users") @Api(tags = "用户管理接口") public class UserController { Map<Long, User> users = Collections.synchronizedMap(new HashMap<>()); @GetMapping("/") @ApiOperation(value = "获取用户列表", notes = "获取用户列表") public List<User> getUserList() { return new ArrayList<>(users.values()); } @PostMapping("/") @ApiOperation(value = "创建用户") public String addUser