Swagger简介
前后端分离
Vue+SpringBoot
产生一个问题
前后端集成联调,前端人员和后端人员无法做到“即使协商,尽早解决”,最终导致问题集中爆发。
解决方案
首先制定一个schema,实时更新最新的API,降低集成的风险;
早些年:制定word计划文档
前后端分离:
- 前端测试后端接口:postman
- 后端提供接口,需要实时更新最新的消息及改动
Swagger
- 号称世界上最流行的Api框架
- RestFul Api文档在线自动生成工具=》API文档与API定义同步更新
- 直接运行,可以在线测试API接口(controller中的);
- 支持多种语言:java php
官网:https://swagger.io/
在项目中使用swagger需要springbox:
- swagger2
- ui
springboot集成swagger
- 新建一个springboot项目=web项目
- 导入相关依赖:
<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>
- 编写一个hello工程
- 集成swagger==》config
@Configuration //声明配置,并注入bean
@EnableSwagger2 //开启swagger2
public class SwaggerConfig {
}
- 测试运行
http://localhost:8080/swagger-ui.html
配置swagger
swagger的bean实例Docket;
//配置了swagger的Docket的bean实例
@Bean
public Docket docket(){
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo());
}
//配置swagger信息=ApiInfo
private ApiInfo apiInfo(){
//作者信息
Contact contact = new Contact("秦疆","http://www.baidu.com","13623724358@163.com");
return new ApiInfo("API 文档 title",
"API 文档 描述",
"版本1.0",
"http://www.baidu.com",
contact,
"Apache 2.0",
"http://www.apche.org/licenses/LTCENSE-2.0",
new ArrayList()
);
}
Swagger配置扫描接口
Docketselect()
@Bean
public Docket docket(){
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
//RequestHandlerSelectors 配置要扫描接口的方式
//basePackage 指定要扫描的包
//any 扫描全部
//none 都不扫描
//withClassAnnotation() 扫描类上的注解,传入一个注解的class
//withMethodAnnotation 扫描方法上的注解
.apis(RequestHandlerSelectors.basePackage("com.kuang.swagger.controller"))
//paths 过滤什么路径
.paths(PathSelectors.ant("/kuang/**"))
.build();//build }
配置是否启动Swagger
@Bean
public Docket docket(){
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.enable(false)//enable 是否启动Swagger,如果为false,则swagger不能在浏览器中访问
.select()
.apis(RequestHandlerSelectors.basePackage("com.kuang.swagger.controller"))
.build();//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.kuang.swagger.controller"))
.build();//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");
}
实体类配置:
//@Api(注释 )
@ApiModel("用户实体类")
public class User {
@ApiModelProperty("用户名")
public String username;
@ApiModelProperty("密码")
public String password;
}
controller
@Api(tags = "helloController",description = "hello控制类")
@RestController
public class HelloController {
@ApiOperation("hello1")//接口
@GetMapping(value = "/hello")
public String hello(){
return "hello";
}
//只要我们的接口中,返回值中存在实体类,他就会被扫描到Swagger中
@PostMapping(value = "/user")
public User User(){
return new User();
}
@ApiOperation("hello2")//接口
@GetMapping(value = "/hello2")
public String hello2(@ApiParam(" 用户名") String username){
return "hello"+username;
}
@ApiOperation("test")//接口
@PostMapping(value = "/postTest")
public User test(@ApiParam(" 用户名") User user){
return user;
}
}
总结
- 我们可以通过Swagger给一些比较难理解的属性或者接口,增加注释信息
- 接口文档实时更新
- 可以在线测试
Swagger是一个优秀的工具
在正式发布的时候,关闭Swagger!!!出于安全考虑,而且节省内存空间。