一、介绍SpringBoot集成
学习模板:
- 了解Swagger的作用和概念
- 了解前后端分离
- 在SpringBoot中集成swagger
Swagger简介
前后端分离
Vue + SpringBoot
后端时代:前端只用管理静态页面;html由后端做。
前后端分离时代:
- 后端:控制层、服务层、数据访问层
- 前端:前端控制层、视图层
- 位置后端数据,json。已经存在了,不需要后端,前端工程依旧能够跑起来
- 前后端如何交互?通过API
- 前后端相对独立,松耦合
- 前后端甚至可以部署在不同的服务器上
产生一个问题:
- 前后端集成联调,前后端人员和后端任务无法做到,即使协商,尽早解决,最终导致问题集中爆发;
解决方案:
- 首先指定schema【计划的提纲】,实时风险更新API,降低集成的风险;
- 早先年:指定word计划文档;
- 前后端分离时代:
- 前端测试后端接口:postman
- 后端提供接口,需要实时更新最新的消息及改动!
Swagger
- 号称世界上最流行的Api框架
- Restful Api文档在线自动生成工具 => Api文档与API自定义同步更新
- 直接运行,可以在线测试API接口;
- 支持多种语言:(Java,PHP)
- 官网:API Documentation & Design Tools for Teams | Swagger
在项目中使用Swagger,需要导入springbox包,其中包含以下组件
- swagger2
- ui
SpirngBoot集成Swagger
-
新建springBoot web项目
-
寻找依赖
-
在Maven Repository: Search/Browse/Explore (mvnrepository.com)上搜索springfox-swag
-
复制下面两个组件的依赖
-
-
在pom.xml中导入两个依赖
<!-- 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>
-
编写一个Hello工程
-
在主程序同级包下创建controller包,并在包里创建HelloController类
@RestController public class HelloController { @RequestMapping("/hello") public String hello(){ return "hello"; } }
-
-
开启swagger
-
在主程序同级包下创建config包,并在包里创建SwaggerConfig类
@Configuration @EnableSwagger2 //开启Swagger 2 public class SwaggerConfig { }
-
-
测试:
- 访问:http://localhost:8080/swagger-ui.html 效果如下
二、配置Swagger信息
Swagger的bean实列Docket;
编写SwaggerConfig类
@Configuration
@EnableSwagger2 //开启Swagger 2
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("吴之谦","http://wuxiuxiang.ysepan.com/","734338421@qq.com");
return new ApiInfo(
"我的SwaggerAPI文档",
"这里写描述",
"v1.0",
"http://wuxiuxiang.ysepan.com/",
contact,
"Apache 2.0",
"http://shiguiyuan.ysepan.com/",
new ArrayList()
);
}
}
刷新页面,效果如下
三、配置扫描接口及开关
下面是swagger扫描到本项目的请求接口
假设我们执行扫描我们自己指定包的接口,可以在配置类中这样写
SwaggerConfig.class
@Configuration
@EnableSwagger2 //开启Swagger 2
public class SwaggerConfig {
//配置Swagger的Docket的bean实例
@Bean
public Docket docket(){
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
//指定扫描包,RequestHandlerSelectors 配置要扫描接口的方式,这里选择的是扫描包的方式
.apis(RequestHandlerSelectors.basePackage("com.kuang.swagger.controller"))
.build();//工程模式
}
省略..........
可选的扫描方式:
- basePackage():扫描包
- any():扫描全部
- none():都不扫描
- withClassAnnotation():扫描类上的注解的接口
- withMethodAnnotation() : 扫描方法上的注解的接口
过滤扫描
SwaggerConfig的docket()方法修改
@Bean
public Docket docket(){
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.kuang.swagger.controller"))
//paths()过滤,过滤/kuang/**下面的接口
.paths(PathSelectors.ant("/kuang/**"))
.build();
}
可选方式:
-
any():过滤全部
-
none():都不过滤
…
Swagger启用/禁用
enable()方法的参数为true为启用,参数为false(默认)则为禁用
@Bean
public Docket docket(){
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.enable(false)
.select()
.apis(RequestHandlerSelectors.basePackage("com.kuang.swagger.controller"))
.build();
}
刷新页面后的效果
题目:我只希望Swa在生产环境中使用,在发布的时候不使用
- 判断是否是生产环境 flag
- 注入enable()
先准备两份配置文件,分别为开发环境和生产环境
application.properties
#激活开发环境的配置文件
spring.profiles.active=dev
application-dev.properties
#设置端口号
server.port=8081
application-pro.properties
#设置端口号
server.port=8082
Swagger配置类
@Configuration
@EnableSwagger2 //开启Swagger 2
public class SwaggerConfig {
//配置Swagger的Docket的bean实例
@Bean
public Docket docket(Environment environment){
//设置要显示的Swagger环境(这里比对的是dev和test,都没比对上则返回false)
Profiles profiles = Profiles.of("dev","test");
//判断是否处在自己设定的环境中
boolean flag = environment.acceptsProfiles(profiles);
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.enable(flag)//开关
.select()
.apis(RequestHandlerSelectors.basePackage("com.kuang.swagger.controller"))
.build();
}
//以下配置信息省略.........
}
注意:测试的时候记得填写对应环境的端口号
四、分组和接口注释及小结
配置API文档的分组
使用groupName( )方法
@Bean
public Docket docket(Environment environment){
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.groupName("狂神")
.select()
.apis(RequestHandlerSelectors.basePackage("com.kuang.swagger.controller"))
.build();
}
效果如下
如何配置多个分组?
在swagger配置文件中配置多个实例
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@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");
}
@Bean
public Docket docket(Environment environment){
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.groupName("狂神")
.select()
.apis(RequestHandlerSelectors.basePackage("com.kuang.swagger.controller"))
.build();
}
//以下代码省略。。。。。
实现效果:
实体类配置
User实体类
@ApiModel("用户实体类") //页面的标注信息
public class User {
@ApiModelProperty("用户名") //字段的标注信息
public String username;
@ApiModelProperty("密码")//字段的标注信息
public String password;
}
效果
controller类配置
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "hello";
}
@ApiOperation("Hello2请求接口") //方法注解
@RequestMapping("/hello")
public String hello2(@ApiParam String username){ //参数注解
return "hello"+username;
}
@PostMapping(value = "/user")
public User user(){
return new User();
}
}
- @ApiOperation(“Hello2请求接口”) //方法注解
- @ApiParam //参数注解
接口测试
传参测试
测试效果
总结
- 我们可以通过swagger给以下比较难理解的属性或者接口,增加注释信息
- 接口文档实时更新
- 可以在线测试
【注意点】
正式发布的时候,关闭Swagger!!!出于安全考虑,而且节省运行内存;