摘要:Springfox Swagger可以动态生成 API 接口供前后端进行交互和在线调试接口,Spring Boot 框架是目前非常流行的微服务框架,所以,在Spring Boot 项目中集成Springfox非常有意义。介绍Spring Boot集成Springfox Swagger3及swagger的简单应用。

§前言

  Swagger是什么?官方说法:Swagger是一个规范和完整的框架,用于创建、描述、调试和可视化 RESTful 风格的 Web 服务。通俗地说,Swagger 是一个主要用来在线创建文档的插件,主要用来高质量地动态生成 API 接口供前后端进行交互和在线调试接口,如果不生成的话就需要写静态文档来交互,那样不仅速度慢而且不容易修改。发现了痛点就要寻找解决方案,故Swagger应运而生。

  Springfox Swagger是Spring 基于swagger规范,可以将基于SpringMVC和Spring Boot项目的源码自动生成JSON格式的描述文件。本身不是属于Swagger官网提供的。Spring Boot 框架是目前非常流行的微服务框架,所以,在Spring Boot 项目中集成Springfox非常有意义,可以保证及时更新API文档,降低前后端沟通成本,提高系统迭代效率。

  本文所用软件开发环境如下:

   java version 13.0.1

   IntelliJ IDEA 2019.3.2 (Ultimate Edition)

   Spring Boot 2.3.1.RELEASE

§Spring Boot 集成 Springfox Swagger3

  若想为Spring Boot项目添加无需任何配置的springfox,需引入其maven依赖库:

        <!--集成 springfox swagger3 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>

  为了便于管理API文档,建议编写一个Swagger配置类,这里的配置类如下:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket; /**
* Swagger 配置类
*
* @author Wiener
* @date 2021/2/26
*/
@EnableOpenApi
@Configuration
public class SwaggerConfig {
//读取application.properties 文件设置的是否开启swagger属性,正式环境一般需要关闭
@Value(value = "${swagger.enabled}")
Boolean swaggerEnabled; @Bean
public Docket createRestApi() {
return new Docket(DocumentationType.OAS_30).apiInfo(apiInfo())
// 是否开启swagger
.enable(swaggerEnabled).select()
// 过滤条件,扫描指定路径下的文件
.apis(RequestHandlerSelectors.basePackage("com.eg.wiener.controller"))
//只保留/user/*风格的路径,大家可以调试一下
// .paths(PathSelectors.ant("/user/*"))
// 指定路径处理,PathSelectors.any()代表不过滤任何路径
.paths(PathSelectors.any())
.build().pathMapping("/");
} private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("Spring Boot集成Springfox Swagger示例")
.description("楼兰胡杨")
// 开发者信息
.contact(new Contact("楼兰胡杨", "https://www.cnblogs.com/east7/", "wienerXXX@163.com"))
.version("1.0.0")
.build();
}
}

  注解@EnableOpenApi用于开启Swagger的自动配置,如果没加的话,自然而然也就看不到后面的swagger UI面板了。通过select()函数返回一个ApiSelectorBuilder实例,用来控制哪些接口暴露给Swagger UI面板;在 Docket 上添加筛选条件。Docket 类提供了 apis() 和 paths() 两个方法来帮助我们在不同级别上过滤接口:

  • apis() :通过指定扫描路径的方式,让 Swagger 只去某些路径下面扫描文件。
  • paths() :通过筛选 API 的 url 进行过滤。

  在上面的Swagger 配置类SwaggerConfig中,我们定义了 Docket 实例的 apis() 和 paths(),那么,swagger接口文档界面将只会展示包com.eg.wiener.controller中的API。关于PathSelectors.ant()的用法,各位同仁可以调试一下,由于时间有限,未曾验证是否可用。

  另一种解决方案就是使用@ApiIgnore注解屏蔽某些API。如果想在API文档中屏蔽掉某个接口,那么只需要在这个接口上加上@ApiIgnore 即可。

丰富文档内容

  在完成了上述配置后,已经算是初步集成Springfox Swagger3,可以启动服务查看API文档内容了。但是这样的文档主要针对请求本身,描述信息的主要来源是函数的命名,对用户并不友好,我们通常需要使用swagger注解增加一些说明文字来使得API文档内容更加丰满。Swagger中常用的注解及其说明:

@Api:用在类上,说明该类的作用。

@ApiOperation:为API增加方法说明。

@ApiImplicitParams : 用在方法上包含一组参数说明。

@ApiImplicitParam:给方法入参增加说明。

@ApiResponses:用于表示一组响应

@ApiResponse:用在@ApiResponses中,一般用于表达一个错误的响应信息

    l   code:数字,例如400

    l   message:信息,例如"必填参数不可为空"

    l   response:抛出异常的类   

@ApiModel:描述一个Model的信息(一般用在请求参数无法使用@ApiImplicitParam注解进行描述的时候)

    l   @ApiModelProperty:描述一个model的属性

案例分析

  修改API实体类User,添加swagger注解:

@Setter
@Getter
@ToString
@ApiModel("用户实体")
public class User implements Serializable { private static final long serialVersionUID = -8842370047277749376L;
@ApiModelProperty("用户 id")
private Long id;
@ApiModelProperty("用户姓名")
private String userName;
private Integer age;
private String address;
private String mobilePhone;
private String remark; public User() {
}
public User(Long id, String userName, Integer age) {
this.id = id;
this.userName = userName;
this.age = age;
}
}

  在实体类使用注解@ApiModel和 @ApiModelProperty可以添加属性备注,这些备注信息将展示在swagger页面的Schema中,效果如下:

  在 controller 包下新建 UserController.java 类,通过在控制器类上增加 @Api 注解,可以给控制器添加标签信息。通过在接口方法上增加 @ApiOperation 注解来添加对接口的描述。关于swagger注解的更多信息,这里就不再阐述,需要的话,请去问问度娘。

/**
* @author Wiener
*/
@RestController
@RequestMapping("/user")
@Api(tags="用户API")
public class UserController { private static Logger logger = LoggerFactory.getLogger(UserController.class); /**
* 同时使用 @RequestBody 与 @RequestParam()
* http://localhost:8087/wiener/user/addUser?token=IamToken
* @param user
* @param token
* @return
* @throws Exception
*/
@PostMapping("/addUser")
@ApiOperation(value="用户新增")
public User addUser(@RequestBody User user, @RequestParam("token") String token) throws Exception {
user.setRemark(token);
return user;
}
/**
* 示例地址 http://localhost:8087/wiener/user/getUser?id=9996669
* @return
* @throws Exception
*/
@GetMapping("/getUser")
@ApiOperation(value="用户查询(ID)")
@ApiImplicitParam(name="id",value="查询ID",required=true)
public User getUser(Long id) throws Exception {
logger.info("--------------------");
User user = new User();
user.setId(id);
user.setAddress("测试地址是 " + UUID.randomUUID().toString());
logger.info("类信息: {}", user.getClass());
return user;
}
}

  这个时候已经算是进一步集成Springfox-Swagger3了,启动项目后访问http://IP:port/your-app-root/swagger-ui/index.html可以看到我们的swagger文档界面,其中,IP表示服务器IP地址,port表示项目配置的端口号,your-app-root表示项目配置的根路径。在我的项目中,其访问路径是http://127.0.0.1:8087/wiener/swagger-ui/index.html,在浏览器访问此URL进入如下文档界面:

使用 SwaggerUI访问API

  找到用户查询API getUser并进入接口详情页面,可以在详情页面右侧看到** Try it out** 按钮,单击此按钮即可进入接口调用界面,在id输入框随机输入一个Long类型的数字,单击执行即可请求getUser方法:

  从API返回值可以得出结论:使用 Swagger UI 成功访问了API,故集成集成Springfox Swagger3完毕。有底气甩了Postman了,你认为呢?

§小结

  Springfox既可以减少创建文档的工作量,同时接口文档又可以融合到代码之中去,使维护API文档和修改代码同步进行,让我们在修改代码逻辑的同时方便的修改文档说明,这太酷了。另外,Swagger UI界面页提供了强大的页面测试功能来调试每个RESTful API。欢迎点赞阅读,一同学习交流;若有疑问,请在文章下方留下你的神评妙论!

§Reference

Spring Boot集成Springfox Swagger3和简单应用的更多相关文章

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

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

  2. Spring Boot集成Reactor事件处理框架的简单示例

    1. Reactor简介 Reactor 是 Spring 社区发布的基于事件驱动的异步框架,不仅解耦了程序之间的强调用关系,而且有效提升了系统的多线程并发处理能力. 2. Spring Boot集成 ...

  3. Spring boot集成swagger2

    一.Swagger2是什么? Swagger 是一款RESTFUL接口的文档在线自动生成+功能测试功能软件. Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格 ...

  4. Spring Boot 集成 Swagger2 与配置 OAuth2.0 授权

    Spring Boot 集成 Swagger2 很简单,由于接口采用了OAuth2.0 & JWT 协议做了安全验证,使用过程中也遇到了很多小的问题,多次尝试下述配置可以正常使用. Maven ...

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

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

  6. Spring Boot 集成 Swagger 构建接口文档

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

  7. 【SpringBoot】Spring Boot 集成SwaggerAPI

    Spring Boot 集成SwaggerAPI 文章目录 Spring Boot 集成SwaggerAPI Swagger 添加依赖 配置类 config 控制类 controller 接口测试 页 ...

  8. Spring boot入门(二):Spring boot集成MySql,Mybatis和PageHelper插件

    上一篇文章,写了如何搭建一个简单的Spring boot项目,本篇是接着上一篇文章写得:Spring boot入门:快速搭建Spring boot项目(一),主要是spring boot集成mybat ...

  9. Quartz与Spring Boot集成使用

    上次自己搭建Quartz已经是几年前的事了,这次项目中需要定时任务,需要支持集群部署,想到比较轻量级的定时任务框架就是Quartz,于是来一波. 版本说明 通过搜索引擎很容易找到其官网,来到Docum ...

随机推荐

  1. Preliminaries for Benelux Algorithm Programming Contest 2019

    A. Architecture 如果行最大值中的最大值和列最大值中的最大值不同的话,那么一定会产生矛盾,可以手模一个样例看看. 当满足行列最大值相同条件的时候,就可以判定了. 因为其余的地方一定可以构 ...

  2. Educational Codeforces Round 84 (Div. 2)

    Educational Codeforces Round 84 (Div. 2) 读题读题读题+脑筋急转弯 = =. A. Sum of Odd Integers 奇奇为奇,奇偶为偶,所以n,k奇偶性 ...

  3. Codeforces Round #648 (Div. 2) D. Solve The Maze

    这题犯了一个很严重的错误,bfs 应该在入队操作的同时标记访问,而不是每次只标记取出的队首元素. 题目链接:https://codeforces.com/contest/1365/problem/D ...

  4. 记录一些Python中不常用但非常好用的函数

    zfill(): 方法返回指定长度的字符串,原字符串右对齐,前面填充0. print('Helloworld'.zfill(50))0000000000000000000000000000000000 ...

  5. 通过k8s部署dubbo微服务并接入ELK架构

    需要这样一套日志收集.分析的系统: 收集 -- 能够采集多种来源的日志数据 (流式日志收集器) 传输 -- 能够稳定的把日志数据传输到中央系统 (消息队列) 存储 -- 可以将日志以结构化数据的形式存 ...

  6. kubernetes实战-配置中心(一)configmap资源

    在我们的环境中测试使用configmap资源,需要先对我们的环境进行一些准备,首先将dubbo服务调整为0个pod ,然后把zookeeper进行拆分: 拆分zk环境,模拟测试环境跟生产环境: 停止z ...

  7. MSE,RMSE

    MSE: Mean Squared Error 均方误差是指参数估计值与参数真值之差平方的期望值; MSE可以评价数据的变化程度,MSE的值越小,说明预测模型描述实验数据具有更好的精确度. RMSE  ...

  8. Win10 Nodejs搭建http-server注意点

    下载安装,并用命令行查看版本:如果提示输入命令找不到等,可能是没有安装成功,或者是环境变量引起的: 如果在提示安装不成功可能是win10权限问题,最好使用管理员模式运行cmd,再用cmd命令打开安装文 ...

  9. mark::开源绘图工具graphviz

    http://blog.csdn.net/iamljj/article/details/5862930 http://codeforces.com/contest/601/problem/D

  10. UMD 模块 vs CJS 模块

    UMD 模块 vs CJS 模块 使用方式 UMD, window 全局注册后,直接使用 <!DOCTYPE html> <html lang="zh-Hans" ...