在应用开发过程中经常需要对其他应用或者客户端提供 RESTful API 接口,尤其是在版本快速迭代的开发过程中,修改接口的同时还需要同步修改对应的接口文档,这使我们总是做着重复的工作,并且如果忘记修改接口文档,就可能造成不必要的麻烦。

为了解决这些问题,Swagger 就孕育而生了,那让我们先简单了解下。

Swagger 简介

Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务

总体目标是使客户端和文件系统作为服务器,以同样的速度来更新。文件的方法、参数和模型紧密集成到服务器端的代码中,允许 API 始终保持同步。

下面我们在 Spring Boot 中集成 Swagger 来构建强大的接口文档。

Spring Boot 集成 Swagger

Spring Boot 集成 Swagger 主要分为以下三步:

  1. 加入 Swagger 依赖
  2. 加入 Swagger 文档配置
  3. 使用 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(@RequestBody User user) {
users.put(user.getId(), user);
return "success";
} @GetMapping("/{id}")
@ApiOperation(value = "获取指定 id 的用户")
@ApiImplicitParam(name = "id", value = "用户 id", paramType = "query", dataTypeClass = Long.class, defaultValue = "999", required = true)
public User getUserById(@PathVariable Long id) {
return users.get(id);
} @PutMapping("/{id}")
@ApiOperation(value = "根据 id 更新用户")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "用户 id", defaultValue = "1"),
@ApiImplicitParam(name = "name", value = "用户姓名", defaultValue = "wupx"),
@ApiImplicitParam(name = "age", value = "用户年龄", defaultValue = "18")
})
public User updateUserById(@PathVariable Long id, @RequestParam String name, @RequestParam Integer age) {
User user = users.get(id);
user.setName(name);
user.setAge(age);
return user;
} @DeleteMapping("/{id}")
@ApiOperation(value = "删除用户", notes = "根据 id 删除用户")
@ApiImplicitParam(name = "id", value = "用户 id", dataTypeClass = Long.class, required = true)
public String deleteUserById(@PathVariable Long id) {
users.remove(id);
return "success";
}
}

启动项目,访问 http://localhost:8080/swagger-ui.html,可以看到我们定义的文档已经在 Swagger 页面上显示了,如下图所示:

到此为止,我们就完成了 Spring Boot 与 Swagger 的集成。

同时 Swagger 除了接口文档功能外,还提供了接口调试功能,以创建用户接口为例,单击创建用户接口,可以看到接口定义的参数、返回值、响应码等,单击 Try it out 按钮,然后点击 Execute 就可以发起调用请求、创建用户,如下图所示:

注解介绍

由于 Swagger 2 提供了非常多的注解供开发使用,这里列举一些比较常用的注解。

@Api

@Api 用在接口文档资源类上,用于标记当前类为 Swagger 的文档资源,其中含有几个常用属性:

  • value:定义当前接口文档的名称。
  • description:用于定义当前接口文档的介绍。
  • tag:可以使用多个名称来定义文档,但若同时存在 tag 属性和 value 属性,则 value 属性会失效。
  • hidden:如果值为 true,就会隐藏文档。

@ApiOperation

@ApiOperation 用在接口文档的方法上,主要用来注解接口,其中包含几个常用属性:

  • value:对API的简短描述。
  • note:API的有关细节描述。
  • esponse:接口的返回类型(注意:这里不是返回实际响应,而是返回对象的实际结果)。
  • hidden:如果值为 true,就会在文档中隐藏。

@ApiResponse、@ApiResponses

@ApiResponses 和 @ApiResponse 二者配合使用返回 HTTP 状态码。@ApiResponses 的 value 值是 @ApiResponse 的集合,多个 @ApiResponse 用逗号分隔,其中 @ApiResponse 包含的属性如下:

  • code:HTTP状态码。
  • message:HTTP状态信息。
  • responseHeaders:HTTP 响应头。

@ApiParam

@ApiParam 用于方法的参数,其中包含以下几个常用属性:

  • name:参数的名称。
  • value:参数值。
  • required:如果值为 true,就是必传字段。
  • defaultValue:参数的默认值。
  • type:参数的类型。
  • hidden:如果值为 true,就隐藏这个参数。

@ApiImplicitParam、@ApiImplicitParams

二者配合使用在 API 方法上,@ApiImplicitParams 的子集是 @ApiImplicitParam 注解,其中 @ApiImplicitParam 注解包含以下几个参数:

  • name:参数的名称。
  • value:参数值。
  • required:如果值为 true,就是必传字段。
  • defaultValue:参数的默认值。
  • dataType:数据的类型。
  • hidden:如果值为 true,就隐藏这个参数。
  • allowMultiple:是否允许重复。

@ResponseHeader

API 文档的响应头,如果需要设置响应头,就将 @ResponseHeader 设置到 @ApiResponseresponseHeaders 参数中。@ResponseHeader 提供了以下几个参数:

  • name:响应头名称。
  • description:响应头备注。

@ApiModel

设置 API 响应的实体类,用作 API 返回对象。@ApiModel 提供了以下几个参数:

  • value:实体类名称。
  • description:实体类描述。
  • subTypes:子类的类型。

@ApiModelProperty

设置 API 响应实体的属性,其中包含以下几个参数:

  • name:属性名称。
  • value:属性值。
  • notes:属性的注释。
  • dataType:数据的类型。
  • required:如果值为 true,就必须传入这个字段。
  • hidden:如果值为 true,就隐藏这个字段。
  • readOnly:如果值为 true,字段就是只读的。
  • allowEmptyValue:如果为 true,就允许为空值。

到此为止,我们就介绍完了 Swagger 提供的主要注解。

总结

Swagger 可以轻松地整合到 Spring Boot 中构建出强大的 RESTful API 文档,可以减少我们编写接口文档的工作量,同时接口的说明内容也整合入代码中,可以让我们在修改代码逻辑的同时方便的修改接口文档说明,另外 Swagger 也提供了页面测试功能来调试每个 RESTful API。

如果项目中还未使用,不防尝试一下,会发现效率会提升不少。

本文的完整代码在 https://github.com/wupeixuan/SpringBoot-Learninterface-doc 目录下。

最好的关系就是互相成就,大家的在看、转发、留言三连就是我创作的最大动力。

参考

http://swagger.io

https://github.com/wupeixuan/SpringBoot-Learn

《Spring Boot 2 实战之旅》

Spring Boot 集成 Swagger 构建接口文档的更多相关文章

  1. Spring Boot 集成 Swagger生成接口文档

    目的: Swagger是什么 Swagger的优点 Swagger的使用 Swagger是什么 官网(https://swagger.io/) Swagger 是一个规范和完整的框架,用于生成.描述. ...

  2. spring boot:用swagger3生成接口文档,支持全局通用参数(swagger 3.0.0 / spring boot 2.3.2)

    一,什么是swagger? 1,  Swagger 是一个规范和完整的文档框架, 用于生成.描述.调用和可视化 RESTful 风格的 Web 服务文档 官方网站: https://swagger.i ...

  3. Spring Boot Swagger2自动生成接口文档

    一.简介 在当下这个前后端分离的技术趋势下,前端工程师过度依赖后端工程师的接口和数据,给开发带来了两大问题: 1.问题一.后端接口查看难:要怎么调用?参数怎么传递?有几个参数?参数都代表什么含义? 2 ...

  4. Spring Boot 整合Swagger2构建API文档

    1.pom.xml中引入依赖 <dependency> <groupId>io.springfox</groupId> <artifactId>spri ...

  5. Spring Boot集成JasperReports生成PDF文档

    由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲染生成PDF文档.本人文采欠缺,写作能力 ...

  6. Spring Boot 集成 Swagger,生成接口文档就这么简单!

    之前的文章介绍了<推荐一款接口 API 设计神器!>,今天栈长给大家介绍下如何与优秀的 Spring Boot 框架进行集成,简直不能太简单. 你所需具备的基础 告诉你,Spring Bo ...

  7. Spring Boot 集成 Swagger 生成 RESTful API 文档

    原文链接: Spring Boot 集成 Swagger 生成 RESTful API 文档 简介 Swagger 官网是这么描述它的:The Best APIs are Built with Swa ...

  8. springboot+mybatis-puls利用swagger构建api文档

    项目开发常采用前后端分离的方式.前后端通过API进行交互,在Swagger UI中,前后端人员能够直观预览并且测试API,方便前后端人员同步开发. 在SpringBoot中集成swagger,步骤如下 ...

  9. Spring boot集成Swagger,并配置多个扫描路径

    Spring boot集成Swagger,并配置多个扫描路径 1:认识Swagger Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目 ...

随机推荐

  1. Redis数据类型简介(十分钟快速学习Redis)

    如何在ubuntu18.04上安装和保护redis 如何连接到Redis数据库 如何管理Redis数据库和Keys 如何在Redis中管理副本和客户端 如何在Redis中管理字符串 如何在Redis中 ...

  2. 力扣题解-面试题22. 链表中倒数第K个节点

    题目描述 输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点.例如,一个链表有6个节点,从头节点开始,它们的值依次是1.2.3.4.5. ...

  3. 初识Page Object

    PageObject是UI自动化测试项目开发实践的最佳设计模式之一,它的主要特点体现在对界面交互细节的封装上,使测试用例更加专注于业务的操作,从而提高测试用例的可维护性. 1.认识Page Objec ...

  4. 【Jenkins学习】【第二节】 jenkins构建触发器定时任务

    一.定时构建 Build periodically:定时执行构建任务,不管远程代码分支上的代码是否发生变化,都执行一次构建. 语法:* * * * *(五颗星,中间用空格隔开) 第一个:分钟,取值0~ ...

  5. 你想了解的python基础数据类型这里都有

    目录 python基础数据总结 数字型数据类型 数字型数据基本知识 算术运算符 进制 二进制运算符 字符串数据类型 字符串基础知识 字符串数据操作方法(增 查 改) 集合数据类型 集合基础知识 集合元 ...

  6. Jenkins-Sonar集成配置及注意点

    首先说说关于Jenkins集成Sonar的相关配置:我jenkins与Sonar不在同一个服务器上! 先现在 SonarQube Scanner 插件. SonarQube Servers:系统配置 ...

  7. jdk1.8的一些特性

    一.jdk1.8的特性: Lambda表达式 函数式接口 方法引用 接口的默认方法和静态方法 Optional Streams 并行数组 新时间日期API 二.Lambda表达式: Lambda 表达 ...

  8. linux DRM/KMS 测试工具 modetest、kmscude、igt-gpu-tools (一)

    这里整理几个在学习Linux DRM/KMS中用到的几个工具,modetest.kmscude.igt-gpu-tools. 简介: modetest 是由libdrm提供的测试程序,可以查询显示设备 ...

  9. 苏浪浪 201771010120 第三周 Java基本程序设计总结

    理论知识: Java有五种语句: (1)方法调用语句(2)表达式语句(3)复合语句(4)控制语句(5)package.import语句 3.8控制流程 3.9大数值 *如果基本的整型和浮点型数据无法达 ...

  10. poj2778 AC自动机

    以下内容均为转载,,只有代码是自己写的=-= http://blog.csdn.net/morgan_xww/article/details/7834801   转载地址 博主写的很好 ------- ...