注:看了狂神说自己所作的笔记 狂神说的笔记https://mp.weixin.qq.com/s/0-c0MAgtyOeKx6qzmdUG0w
学习目标
- 了解Swagger的作用和概念
- 了解前后端分离
- 在Springboot中集成Swagger
Swagger
前后端分离
Vue+Springboot
后端时代:前端只用管前端静态页面;后端要htmk和jsp渲染数据。
前后端分离时代
- 后端:后端控制层,服务层,数据访问层
- 前端:前端控制层,视图层
- 伪造后端数据,json。已经存在了,不需要后端前端就可以单独运行
- 前后端如何交互?===API
- 前后端先对独立,松耦合
- 前后端可以部署在不同的服务器
产生了问题
- 前后端联调,前后端无法做到“即使协商,尽早解决“,最终导致问题集中爆发.
- 首先制定schema【计划的提纲】,实时更新最新的Api,降低集成风险;
- 早期:制定word计划文档;
- 前后端分离
- 前端测试后端接口:postman
- 后端提供接口,需要实时更新最新的消息改动
Swagger
- 世界上最流行的Api框架
- RestFul Api 文档在线自动生成工具=API文档与API定义同步更新
- 直接运行,可以在线测试API接口
- 支持多种语言(java,php)
在项目中使用springfox;
- swagger2
- ui
SpringBoot集成Swagger2
1.新建springboot项目
2.pom导入swagger2的maven配置
<!-- 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>
---------------------------------------------------------------------------------------
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.10.5</version>
</dependency>
<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>
2.9.2 和 2.10.5 有差别的需要多导入一个jar 不然会报一个错
@EnableSwagger2这个注解不能使用了 换成@EnableSwagger2WebMvc
3.配置swagger配置文件
@Configuration
@EnableSwagger2WebMvc
public class SwaggerConfig {
}
4.访问测试页面http://localhost:8080/swagger-ui.html
配置Swagger
1、Swagger实例Bean是Docket,所以通过配置Docket实例来配置Swaggger。
@Bean //配置docket以配置Swagger具体参数
public Docket docket() {
return new Docket(DocumentationType.SWAGGER_2);
}
----------------------------------------
@Bean
public Docket docket() {
return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo());
}
//配置文档信息
private ApiInfo apiInfo() {
Contact contact = new Contact("联系人名字", "http://xxx.xxx.com/联系人访问链接", "联系人邮箱");
return new ApiInfo(
"Swagger学习", // 标题
"学习演示如何配置Swagger", // 描述
"v1.0", // 版本
"http://terms.service.url/组织链接", // 组织链接
contact, // 联系人信息
"Apach 2.0 许可", // 许可
"许可链接", // 许可连接
new ArrayList<>()// 扩展
);
}
配置扫描接口
1、构建Docket时通过select()方法配置怎么扫描接口。
@Bean
public Docket docket() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()// 通过.select()方法,去配置扫描接口,RequestHandlerSelectors配置如何扫描接口
.apis(RequestHandlerSelectors.basePackage("com.kuang.swagger.controller"))
.build();
}
--------------------------------------------------------
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) // 根据包路径扫描接口
配置Swagger开关
1、通过enable()方法配置是否启用swagger,如果是false,swagger将不能在浏览器中访问了
@Bean
public Docket docket() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.enable(false) //配置是否启用Swagger,如果是false,在浏览器将无法访问
.select()// 通过.select()方法,去配置扫描接口,RequestHandlerSelectors配置如何扫描接口
.apis(RequestHandlerSelectors.basePackage("com.kuang.swagger.controller"))
// 配置如何通过path过滤,即这里只扫描请求以/kuang开头的接口
.paths(PathSelectors.ant("/kuang/**"))
.build();
}
2、如何动态配置当项目处于test、dev环境时显示swagger,处于prod时不显示?
@Bean
public Docket docket(Environment environment) {
// 设置要显示swagger的环境
Profiles of = Profiles.of("dev", "test");
// 判断当前是否处于该环境
// 通过 enable() 接收此参数判断是否要显示
boolean b = environment.acceptsProfiles(of);
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.enable(b) //配置是否启用Swagger,如果是false,在浏览器将无法访问
.select()// 通过.select()方法,去配置扫描接口,RequestHandlerSelectors配置如何扫描接口
.apis(RequestHandlerSelectors.basePackage("com.kuang.swagger.controller"))
// 配置如何通过path过滤,即这里只扫描请求以/kuang开头的接口
.paths(PathSelectors.ant("/kuang/**"))
.build();
}
配置API分组
1、如果没有配置分组,默认是default。通过groupName()方法即可配置分组
@Bean
public Docket docket(Environment environment) {
return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
.groupName("hello") // 配置分组
// 省略配置....
}
2、重启项目查看分组
3、如何配置多个分组?配置多个分组只需要配置多个docket即可:
@Bean
public Docket docket1(){
return new Docket(DocumentationType.SWAGGER_2).groupName("group1");
}
@Bean
public Docket docket2(){
return new Docket(DocumentationType.SWAGGER_2).groupName("group2");
}
@Bean
public Docket docket3(){
return new Docket(DocumentationType.SWAGGER_2).groupName("group3");
}
注解
@Data
@ApiModel("角色模型")
public class Role {
@ApiModelProperty("角色名称")
private String rolename;
@ApiModelProperty("用户ID")
private String userId;
}
@RestController
@Api(value="用户controller",tags={"用户操作接口"})
public class HelloController {
@ApiOperation("说你好")
@GetMapping("hello")
public Role sayHello(User user,@ApiParam("密码") String password,Role role)
{
User user1 = new User();
user1.setAge("11");
user1.setUsername("gene");
return role;
}
}