Swagger的讲解与实践
- 下载本文的Swagger实战完整代码链接:https://download.youkuaiyun.com/download/shooter7/38549320
Swagger
学习目标
- 了解Swagger的作用和概念
- 了解前后端分离
- 在Springboot中集成Swagger
Swagger简介
swagger是进行前后端控制接口交互的工具
主流前后端框架:Vue(前端)+SpringBoot(后端)
后端时代:前端只用管理静态的页面。html=>后端。模板引擎JSP=>后端是主力
前后端分离时代:
- 后端 :控制层controller、服务层service、数据访问层dao【后端团队】
- 前端:前端控制层、视图层【前端团队】
- 伪造后端数据,json。已经存在了,不需要后端,依旧能够跑起来
- 前后端如何交互?=》API
- 前后端相对独立,松耦合
- 前后端甚至可以部署在不同的服务器上
产生的一个问题 - 前后端集成联调,前端人员和后端人员无法做到“即时协商,尽早解决”,最终导致问题的集中的爆发
解决方案: - 首先指定schema【计划的提纲】,实时更新API,降低集成的风险;
- 早些年:指定的是word计划文档
- 前后端分离:
- 前端测试后端接口:postman
- 后端提供接口,需要实时更新最新的消息及改动
Swagger优点:
- ResultFul Api文档在线自动生成工具=>Api文档与API定义同步更新
- 直接运行,可以在线测试API接口
- 支持多种语言:(Java,Php…)
- 世界上最流行的Api框架
官网:https://swagger.io/
在项目中使用Swagger需要Springfox;
- swagger2
- ui
SpringBoot集成Swagger
- 新建一个Springboot项目=web项目
- 导入相关的依赖(这里版本用的是2.10.5)
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.10.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.10.5</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-spring-webmvc</artifactId>
<version>2.10.5</version>
</dependency>
- 编写一个hello工程
- 配置Swagger信息==>config
@Configuration
@EnableSwagger2WebMvc
public class SwaggerConfig {
}
注意:
- 因swagger-ui Java使用的是 2.10.5 版本,此版本与 3.0 和 原有2.9 版本及以下的版本不同,如果你选择使用 webflux 进行开发此时的pom.xml 文件应该引入如下配置:
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-spring-webflux</artifactId>
<version>2.10.5</version>
</dependency>
同时可以在 SwaggerConfig.java 文件加上 @EnableSwagger2WebFlux 此配置,不然使用原有的 @EnableSwagger2 或者使用成 @EnableSwagger2WebMvc 会出现图片出现的错误。
- 如果你使用的是 springboot-web 进行开发,此时应该引入 pom.xml 如下配置:
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-spring-webmvc</artifactId>
<version>2.10.5</version>
</dependency>
同时可以在 SwaggerConfig.java 文件加上 @EnableSwagger2WebMvc 此配置,不然使用原有的 @EnableSwagger2 或者使用成 @EnableSwagger2WebFlux 会出现图片出现的错误。
5. 测试运行:http://localhost:8080/swagger-ui.html
配置Swagger信息
@Configuration
@EnableSwagger2WebMvc
public class SwaggerConfig {
//配置了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.youkuaiyun.com/shooter7/article/details/121180333", "1123725698@qq.com");
return new ApiInfo("Api Documentation",
"Api Documentation",
"1.0", "urn:tos",
contact, "Apache 2.0",
"http://www.apache.org/licenses/LICENSE-2.0",
new ArrayList());
}
}
Swagger配置扫描接口
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.qi.swagger.controller"))
//过滤什么路径
.paths(PathSelectors.ant("/qi/**"))
.build();
}
配置是否启动Swagger
//配置了Swagger的Docket的bean实例
@Bean
public Docket docket(){
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.enable(false)//enable是否启动了Swagger,如果是False,则Swagger不能在浏览器中访问
.select()
.apis(RequestHandlerSelectors.basePackage("com.qi.swagger.controller"))
//.paths(PathSelectors.ant("/qi/**"))
.build();
}
问题
- 我只希望在我的Swagger在生产环境中使用,在发布的时候不使用?
- 判断是不是生产环境,flag=false
- 注入enable(flag)
//配置了Swagger的Docket的bean实例
@Bean
public Docket docket(Environment environment){
//设置要显示的Swagger环境
Profiles profiles=Profiles.of("dev","test");
//通过environment.acceptsProfiles判断是否在自己设定的环境当中
boolean flag=environment.acceptsProfiles(profiles);
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.enable(flag)//enable是否启动了Swagger,如果是False,则Swagger不能在浏览器中访问
.select()
.apis(RequestHandlerSelectors.basePackage("com.qi.swagger.controller"))
//.paths(PathSelectors.ant("/qi/**"))
.build();
}
配置API文档分组
.groupName("甜瓜")
- 如何配置多个分组;多个Docket实例即可
@Bean
public Docket docket1(){
return new Docket(DocumentationType.SWAGGER_2).groupName("A");
}
@Bean
public Docket docket2(){
return new Docket(DocumentationType.SWAGGER_2).groupName("B");
}
@Bean
public Docket docket3(){
return new Docket(DocumentationType.SWAGGER_2).groupName("C");
}
实体类配置
//@Api(注释)
@ApiModel("用户实体类")
public class User {
@ApiModelProperty("用户名")
public String username;
@ApiModelProperty("密码")
public String password;
}
controller配置
@RestController
public class HelloController {
@GetMapping(value = "/hello")
public String hello(){
return "hello";
}
@PostMapping(value = "/user")
public User user(){
return new User();
}
//Operation接口,不是放在类上面的,是方法
@ApiOperation("hello控制类")
@GetMapping(value = "/hello2")
public String hello2(@ApiParam("用户名") String username){
return "hello"+username;
}
@ApiOperation("Post控制类")
@PostMapping(value = "/postt")
public User postt(@ApiParam("用户名") User user){
int i=5/0;
return user;
}
}
总结
- 我们可以通过Swagger给一些难理解的属性或者接口,增加注释的信息
- 接口文档实时更新
- 可以在线测试
Swagger是一个优秀的工具,几乎所有的大公司都在使用他
【注意点】在正式发布的时候关闭Swagger!!出于安全的考虑,而且节省运行的内存。