(一)、Swagger
- List item
学习目标:
- 了解Swagger的概念及作用
- 掌握在项目中集成Swagger自动生成API文档
1.Swagger简介
前后端分离 (Vue + SringBoot)
- 前端 -> 前端控制层、视图层
- 后端 -> 后端控制层、服务层、数据访问层
- 前后端通过
API
进行交互 - 前后端相对独立,且松耦合
产生的问题 - 前后端集成,前端或者后端无法做到“及时协商,尽早解决”,最终导致问题集中爆发
解决方案 - 首先定义schema [ 计划的提纲 ],并实时跟踪最新的API,降低集成风险
- 早些年制定word计划文档
- 前后端分离:前端测试后端接口:postman
后端提供接口,需要实时更新最新的消息及改动!
Swagger - 号称世界上最流行的API框架
- Restful Api 文档在线自动生成器 =>
API 文档 与API 定义同步更新
- 直接运行,在线测试API接口(其实就是controller requsetmapping)
- 支持多种语言 (如:Java,PHP等)
- 官网:https://swagger.io/
2.Springboot集成Swagger
SpringBoot集成Swagger => springfox,两个jar包
- Springfox-swagger2
- swagger-springmvc
使用Swagger
要求:jdk 1.8 + 否则swagger2无法运行
1、新建一个SpringBoot-web项目
2、添加Maven依赖
(1).SpringBoot版本 要为 2.5.5 并不是2.7.7
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.5</version> <relativePath/> <!-- lookup parent from repository --> </parent>
(2).如果非要使用高版本需要配置这个信息在application.properties
版本过高解决办法:spring.mvc.pathmatch.matching-strategy=ant_path_matcher
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency>
3、编写HelloController,测试确保运行成功!
4、要使用Swagger,我们需要编写一个配置类-SwaggerConfig来配置 Swagger
@Configuration //配置类 @EnableSwagger2// 开启Swagger2的自动配置 public class SwaggerConfig { }
5、访问测试 :http://localhost:8080/swagger-ui.html ,可以看到swagger的界面;
3.配置Swagger
1、Swagger实例Bean是Docket,所以通过配置Docket实例来配置Swagger,通过Docket对象接管了原来默认的配置
package com.jsxs.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; @Configuration @EnableSwagger2 public class swagger { // 配置了swagger的Docket的bean实列 @Bean public Docket docket(){ return new Docket(DocumentationType.SWAGGER_2); } }
2、可以通过apiInfo()属性配置文档信息
//配置swagger信息=apiInfo -----》相当于重写源码 也就是覆盖函数 private ApiInfo apiInfo() { // 作者信息 : 姓名 + 作者访问链接地址 +联系人邮箱 Contact contact = new Contact("李明", "https://blog.csdn.net/qq_69683957?spm=1011.2415.3001.5343", "2261203961@qq.com"); return new ApiInfo("吉士先生 Swagger API文档", //标题 "我对他无法描述", //描述 "1.0", //版本 "https://blog.csdn.net/qq_69683957?spm=1011.2415.3001.5343", //作者访问链接地址 contact, "Apache 2.0", //许可认证 "http://www.apache.org/licenses/LICENSE-2.0", //许可链接 new ArrayList<>()//扩展 );
3、Docket 实例关联上 apiInfo()
// 配置了swagger的Docket的bean实列 @Bean public Docket docket() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()); }
4、测试
package com.jsxs.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.Contact; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; import java.util.ArrayList; import static springfox.documentation.service.ApiInfo.DEFAULT_CONTACT; @Configuration @EnableSwagger2 public class swagger { // 配置了swagger的Docket的bean实列 @Bean public Docket docket() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()); } //配置swagger信息=apiInfo -----》相当于重写源码 也就是覆盖函数 private ApiInfo apiInfo() { // 作者信息 : 姓名 + 作者访问链接地址 +联系人邮箱 Contact contact = new Contact("李明", "https://blog.csdn.net/qq_69683957?spm=1011.2415.3001.5343", "2261203961@qq.com"); return new ApiInfo("吉士先生 Swagger API文档", //标题 "我对他无法描述", //描述 "1.0", //版本 "https://blog.csdn.net/qq_69683957?spm=1011.2415.3001.5343", //作者访问链接地址 contact, "Apache 2.0", //许可认证 "http://www.apache.org/licenses/LICENSE-2.0", //许可链接 new ArrayList<>()//扩展 ); } }
4.配置扫描接口
1、构建Docket时通过select()方法配置怎么扫描接口。
// 配置了swagger的Docket的bean实列 @Bean public Docket docket() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() // RequestHandlerSelectors 配置要扫描接口的方式 // basePackage : 指定要扫描的包 // any() : 扫描全部 // none() : 都不扫描 //withClassAnnotation : 扫描类上的注解 // withMethodAnnotation : 扫描方法上的注解 .apis(RequestHandlerSelectors.basePackage("com.jsxs.controller")) .build(); }
2、重启项目测试,由于我们配置根据包的路径扫描接口,所以我们只能看到一个类 (就是我们扫描的类)
扫描后
3、除了通过包路径配置扫描接口外,还可以通过配置其他方式扫描接口,这里注释一下所有的配置方式:
any() // 扫描所有,项目中的所有接口都会被扫描到 none() // 不扫描接口 // 通过方法上的注解扫描,如withMethodAnnotation(GetMapping.class)只扫描get请求 withMethodAnnotation(final Class<? extends Annotation> annotation) // 通过类上的注解扫描,如.withClassAnnotation(Controller.class)只扫描有controller注解的类中的接口 withClassAnnotation(final Class<? extends Annotation> annotation) basePackage(final String basePackage) // 根据包路径扫描接口 paths(PathSelectors.ant("/guo/**")) //过滤什么路径:过滤/guo下的所有路径
4、除此之外,我们还可以配置接口扫描过滤:
// 配置了swagger的Docket的bean实列 @Bean public Docket docket() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() // RequestHandlerSelectors 配置要扫描接口的方式 // basePackage : 指定要扫描的包 // any() : 扫描全部 // none() : 都不扫描 //withClassAnnotation : 扫描类上的注解 // withMethodAnnotation : 扫描方法上的注解 .apis(RequestHandlerSelectors.basePackage("com.jsxs.controller")) // 过滤什么路径 ---->这里的意思就是只扫描带jsxs请求路径下的资源 .paths(PathSelectors.ant("/jsxs/**")) .build(); }
5、这里的可选值有
any() // 任何请求都扫描 none() // 任何请求都不扫描 regex(final String pathRegex) // 通过正则表达式控制 ant(final String antPattern) // 通过ant()控制
未使用paths()的时候
使用paths()之后,因为我们的Controller控制层中不存在jsxs/
package com.jsxs.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @RequestMapping("/hello") public String test(){ return "测试成功"; } }
5.配置Swagger开关
可以指定相应的环境是否开启swagger功能
1、通过enable()方法配置是否启用swagger,如果是false,swagger将不能在浏览器中访问了
@Bean public Docket docket() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .enable(false) //enable : 是否启动Swagger ,如果为false那么就不启动 否则就启动 .select() .apis(RequestHandlerSelectors.basePackage("com.jsxs.controller")) // .paths(PathSelectors.ant("/jsxs/**")) .build(); }
2、如何动态配置当项目处于test(测试)、dev(开发)环境时不显示swagger,处于prod(生产)时不显示?
设置开发环境和生产环境
application-dev
.properties
# 测试环境 8080 开发环境 8081 生产环境 8082 server.port=8081
application-prod
.properties
# 测试环境 8080 开发环境 8081 生产环境 8082 server.port=8082
激活开发环境
spring.profiles.active=dev
@Bean public Docket docket(Environment environment) { // 设置要显示的swagger环境,激活的环境名: eg:----->dev test那么 Profiles profiles = Profiles.of("dev","test"); // environment.acceptsProfiles 判断是否处在自己设定的环境当中,假如是就返回true ,否则就返回false boolean flag = environment.acceptsProfiles(profiles); return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .enable(flag) //enable : 是否启动Swagger ,如果为false那么就不启动 否则就启动 .select() .apis(RequestHandlerSelectors.basePackage("com.jsxs.controller")) // .paths(PathSelectors.ant("/jsxs/**")) .build(); }