Swagger诞生的背景
在Web技术发展的初期,前后端并没有太过明显的区分,一般前端主要负责的只是是前端静态的界面后端来进行挑大梁。随着技术的发展与应用场景以及规模的扩大,前后端分离成为了一种趋势与势在必行的技术方案。前后端分离之后如何在前端与后端的开发人员之间形成一个契约或沟通,来规范数据的一格式,从而达到前后端的一个数据交互。在这个过程中出现过通过指定接口文档的形式来约定,但是我们的需求或是接口并非一成不变的,改变之后再通过文档来规范的话,并不是一种好的做法,特别是在大团队协作的情况下,并不能做到信息的即时沟通。后来我们又有了PostMan测试工具,来进行接口测试,但是PostMan作为一个第三方工具似乎还是不能达到前后端规范变更即时通知的一个效果,这就产生了我们今天的主角Swagger——全球最好用的接口框架。
Swagger在项目的中引入
简介的swagger引入:
<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>
一个开源项目中Swagger的引入
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
</exclusion>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>1.5.21</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>1.5.21</version>
</dependency>
项目中的使用效果:
Swagger在项目中的一些配置
-
配置扫描固定范围
@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) // 根据包路径扫描接口
-
配置接口扫描过滤
@Bean
public Docket docket() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()// 通过.select()方法,去配置扫描接口,RequestHandlerSelectors配置如何扫描接口
.apis(RequestHandlerSelectors.basePackage("com.kuang.swagger.controller"))
// 配置如何通过path过滤,即这里只扫描请求以/kuang开头的接口
.paths(PathSelectors.ant("/kuang/**"))
.build();
}
除过这样的配置我们也还有其他的一些可以选择:
any() // 任何请求都扫描
none() // 任何请求都不扫描
regex(final String pathRegex) // 通过正则表达式控制
ant(final String antPattern) // 通过ant()控制
-
配置Swagger开关
@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分组
@Bean
public Docket docket(Environment environment) {
return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
.groupName("hello") // 配置分组
// 省略配置....
}
当我们是多人开发团队协作的时候,只要配置注入多个Docket即可,每个人的Docket都会被项目扫描,从而形成不同的分组。
Swagger关键注解
如果我们的接口中传递的值有对象形式的,这些对象将会被Swagger扫描到,而不需要对这个实体对象做什么具体其他的操作,但是如果想要我们的实体在文档生成中有什么更详细的描述的话我们可以使用一些特定的注解:
@ApiModel("用户实体")
public class User {
@ApiModelProperty("用户名")
public String username;
@ApiModelProperty("密码")
public String password;
}
可以通过@API注解tag的属性来给我们的API分类从而使得我们的API更加清晰:
@Api(tags = "商城:订单管理")
@RestController
@RequestMapping("api")
public class StoreOrderController {
@GetMapping("/yxStoreOrder/orderCount")
@ApiOperation(value = "根据商品分类统计订单占比", notes = "根据商品分类统计订单占比", response = ExpressParam.class)
public ResponseEntity orderCount() {
OrderCountDto orderCountDto = yxStoreOrderService.getOrderCount();
return new ResponseEntity(orderCountDto, HttpStatus.OK);
}
}
其他
Swagger的学习是看的B站狂神视频,文档中有部分东西为了节省时间也是参考了狂神的笔记
我们可以通过引入不同的包,来强化或是美化我们的Swagger,在我毕设的开源项目中使用的是:knife4j,还有很多其他的例如:bootstrap-ui、Layui-ui、mg-ui等