Swagger
学习目标
- 了解Swagger的作用和概念
- 了解前后端分离
- 在SpringBoot中集成Swagger
Swagger简介
前后端分离
Vue+SpringBoot
后端时代:前端只用管理静态页面;html—>后端,模板引擎JSP—>后端占了大多工作
前后端分离时代:
-
后端:祸端控制层,服务层,数据访问层 【后端团队】
-
前端:前端控制层,视图层 【前端团队】
- 伪造后端数据,json,已经存在了,不需要后端,前端依旧能够跑起来
-
前后端如何交互?—>API
-
前端后端相对独立,松耦合
-
前后端甚至可以部署在不同的服务器上
产生一个问题
- 前后端集成联调,前端人员和后端人员不发做到,及时协商,尽早解决,最终导致问题集中爆发;
解决方案:
- 首先制定一个schema【计划的提纲】,实时更新最新的API,降低集成的风险、
- 早些年:制定word计划文档
- 前后端分离:
- 前端测试后端接口:postman
- 后端提供接口,需要实时更新最新的消息及改动!
SWagger
- 号称世界上最流行的API框架
- RestFul Api 文档在线工具自动生成工具==》Api文档与API定义同步更新
- 直接运行,可以在线测试API接口
- 支持多种语言(java php)
在项目中使用Swagger springbox;
- swagger2
- ui
SpringBoot集成Swagger
1、新建一个springBoot-web项目
2、导入相关依赖
<!-- 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>
3、编写hello工程
4、配置Swagger config
@Configuration
@EnableSwagger2 //开启swagger2的注解
public class SwaggerConfig {
}
5、测试运行
-
发现问题
-
swagger版本与springboot版本兼容问题 如果使用的时springbooot2.6.5版本就用swagger版本3.0.0
-
2.5.6版本使用swagger版本2.9.2
-
最好是降级springBoot版本,新版本swagger改动很多,大佬忽略
-
配置Swagger
Swagger的bean实例Docket;
package com.zhao.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.ArrayList;
@Configuration
@EnableSwagger2 //开启swagger2的注解
public class SwaggerConfig {
//配置了Swagger的实例
@Bean
public Docket docket(){
return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo());
}
//配置Swagger信息
private ApiInfo apiInfo(){
//作者信息
Contact contact = new Contact("昭昭", "", "");
return new ApiInfo(
"昭昭SwaggerAPI文档",
"我爱学习",
"xx1.0",
"urn:tos",
contact,
"Apache 2.0",
"http://www.apache.org/licenses/LICENSE-2.0",
new ArrayList());
}
}
package com.zhao.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.ArrayList;
@Configuration
@EnableSwagger2 //开启swagger2的注解
public class SwaggerConfig {
//配置了Swagger的实例
@Bean
public Docket docket(){
/*
RequestHandlerSelectors:配置要扫描的接口方式
basePackage:指定要扫描的包
any():全部扫描
none():不扫描
withClassAnnotation:扫描类上的注解,参数时注解的反射对象
withMethodAnnotation:扫描方法上的注解
enable()是否启用swagger,如果为false,则swagger不能在浏览器中访问
*/
return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
.enable(false)//enable()是否启用swagger,如果为false,则swagger不能在浏览器中访问
.select()
.apis(RequestHandlerSelectors.basePackage("com.zhao.controller"))
//.paths(PathSelectors.ant("/zhao/**"))
.build();
}
//配置Swagger信息
private ApiInfo apiInfo(){
//作者信息
Contact contact = new Contact("昭昭", "", "");
return new ApiInfo(
"昭昭SwaggerAPI文档",
"我爱学习",
"xx1.0",
"urn:tos",
contact,
"Apache 2.0",
"http://www.apache.org/licenses/LICENSE-2.0",
new ArrayList());
}
}
需求:只希望Swagger在生产环境中使用,在发布环境下不使用
- 判断是否是生产环境 flag = false
- 注入enable(flag)
//设置要显示的swagger环境
Profiles profiles = Profiles.of("dev","test");
//获取项目的环境:
//通过environment.acceptsProfiles(profiles);方法判断是否处在自己设定的环境中,返回的是布尔值
boolean flag = environment.acceptsProfiles(profiles);
return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
.enable(flag)//enable()是否启用swagger,如果为false,则swagger不能在浏览器中访问
.select()
.apis(RequestHandlerSelectors.basePackage("com.zhao.controller"))
//.paths(PathSelectors.ant("/zhao/**"))
.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");
}
@Bean
public Docket docket4(){
return new Docket(DocumentationType.SWAGGER_2).groupName("D");
}
实体类配置
给实体类加注释:@ApiModel @ApiModelProperty
@ApiModel("用户实体类")
public class User {
@ApiModelProperty("用户名")
public String name;
@ApiModelProperty("密码")
public String pwd;
//只要我们的接口中,返回值类型存在实体类,那么它就会被扫描到Swagger中
@PostMapping("user")
public User user(){
return new User();
}
@PostMapping("user")
public User user(){
return new User();
}
@GetMapping("user2")
public User user2(){
return new User();
}
@PostMapping("post")
public String test(String name){
return "姓名:"+name;
}
总结:
- 我们可以通过Swagger给一些比较难处理的属性或者接口,增加注释信息
- 接口文档实时更新
- 可以在线测试
r();
}
@GetMapping("user2")
public User user2(){
return new User();
}
@PostMapping("post")
public String test(String name){
return "姓名:"+name;
}
[外链图片转存中...(img-fgqnA7X6-1683013019680)]
总结:
1. 我们可以通过Swagger给一些比较难处理的属性或者接口,增加注释信息
2. 接口文档实时更新
3. 可以在线测试