前后端分离时代:
后端:后端控制层,服务层,数据访问层 ;
前端:前端控制层,视图层;
前后端如何交互呢?====>API;
前后端相对独立,松耦合;
产生问题:
前后端集成联调,前端人员和后端人员无法做到“及时协商,尽早解决”,最终导致问题爆发;
解决方案:
早些年:指定word计划文档;
现在:
Swagger
优点:
RestFul Api文档在线自动生成工具==>Api文档Api定义同步更新
直接运行,可以在线测试API接口
Springboot使用Swagger
1.导入依赖
<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>
2.创建Swagger配置类
@Configuration
@EnableSwagger2 //开启Swagger2
public class SwaggerConfig {
}
3.测试运行
http://localhost:9000/swagger-ui.html//url地址
4.配置Swagger信息
@Configuration
@EnableSwagger2 //开启Swagger2
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://txs.asia", "2936592242@qq.com");
return new ApiInfo(
"田先生的SwaggerAPI文档",
"我会去向遥远的远方",
"GEM1.0",
"https://txs.asia",
contact,
"Apache 2.0",
"https://www.apache.org/licenses/LICENSE-2.0",
new ArrayList()
);
}
}
Swagger配置扫描接口
@Bean
public Docket docket(){
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
//enable配置是否启动
.enable(false)
.select()
//RequestHandlerSelectors,配置要扫描接口的方式
//basePackage:指定要扫描接口的包
//any:扫描全部
//withMethodAnnotation:扫描类上的注解
//withMethodAnnotation:扫描方法上的注解
//none:不扫描
.apis(RequestHandlerSelectors.basePackage("com.txs.demo.controller"))
//过滤什么路径
//.paths(PathSelectors.ant("/txs/**"))
.build();
}
配置是否启动
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
//enable配置是否启动
.enable(false)
.select()
问题1:若只希望Swagger在生产环境中使用,在发布版本时不使用?
判断是否为生产环境 flag=false
注入enable(flag)
@Bean
public Docket docket(Environment env){
//设置要显示的环境(生产or发行)
Profiles profiles = Profiles.of("dev", "test");
//通过env.acceptsProfiles判断是否处在自己设定的环境中
boolean flag=env.acceptsProfiles("dev","test");
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
//enable配置是否启动
.enable(flag)//注入flag
.select()
问题2:如何配置API文档的分组?
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.groupName("田先生")//配置API分组
//enable()配置是否启动
.enable(flag)//注入flag
如何配置多个分组:
建立多个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");
}
实体类配置:
只要接口返回之中出现的实体类,Swagger都可以访问到
//只要接口中返回之中存在实体类,就可以被Swagger访问到
@GetMapping(value="/user")
public User user(){
return new User();
}
给文档加注释
@ApiModel("用户实体类")//实体类加注释
public class User {
@ApiModelProperty("用户名")//字段加注释
public String username;
@ApiModelProperty("密码")//字段加注释
public String password;
}
@ApiOperation("获取用户信息")//接口注释
@GetMapping(value="/user")
public User user(){
return new User();
}
@ApiOperation("Hello控制类")
@GetMapping(value="/helloUser")
public String hello(@ApiParam("用户") User user){//参数上注解
return "hello"+user.username;
}
效果:
总结:
1.可以通过Swagger给一些比较难理解的属性,接口,增加注释
2.接口文档实时更新
3.可以在线测试