SpringBoot集成Swagger

Swagger学习目标:

  • 了解Swagger的概念及作用
  • 掌握在项目中集成Swagger自动生成API文档

1.Swagger简介

前后端分类

  • 前端----->前端控制层、视图层
  • 后端----->后端控制层、服务层、数据访问层
  • 前后端通过API进行交互
  • 前后端相对独立且松耦合

产生的问题

  • 前后端集成,前端或者后端无法做到“及时协商,尽早解决”,最终导致问题集中爆发

解决方案

  • 首先定义schema【计划的提纲】,并实时跟踪最新的API,降低集成风险、

Swagger

  • 号称世界上最流行的API框架
  • Restful API 文档在线自动生成器 ======>API文档与API定义同步更新
  • 直接运行,在线测试API
  • 支持多种语言(如:Java,PHP)
  • 官网:https://swagger.io/

2.SpringBoot集成

SpringBoot集成Swagger=====>springfox,两个jar包

  • Springfox-swagger2
  • swagger-springmvc

使用Swagger

要求jdk1.8+否则Swagger2无法运行

步骤:

1.新建一个springboot项目

2.添加Maven依赖

 1 <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
 2         <dependency>
 3             <groupId>io.springfox</groupId>
 4             <artifactId>springfox-swagger2</artifactId>
 5             <version>2.9.2</version>
 6         </dependency> <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger- ui -->
 7         <dependency>
 8             <groupId>io.springfox</groupId>
 9             <artifactId>springfox-swagger-ui</artifactId>
10             <version>2.9.2</version>
11         </dependency>

3.编写HelloController,测试确保运行成功

1 @RestController
2 public class HelloController {
3     @RequestMapping("/hello")
4     public String hello(){
5         return "helloworld";
6     }
7 }

 

4.要使用Swagger,我们需要编写一个配置类SwaggerConfig来配置Swagger

1 @Configuration  //配置类
2 @EnableSwagger2   //开启Swagger2的自动配置
3 public class SwaggerConfig {
4 }

 

5.测试访问:http://localhost:8080/swagger-ui.html#/,可以看到Swagger的界面

 

 

3.配置Swagger

1.Swagger实例Bean是Docket,所以通过配置Docket实例来配置Swagger。

1 @Bean
2     public Docket docket(){
3         return new Docket(DocumentationType.SWAGGER_2);
4     }

 

2.通过apiInfp()属性配置文档信息

 1 private ApiInfo apiInfo(){
 2         Contact contact = new Contact("dz", "https://www.cnblogs.com/lxzlovewyq/", "942142624@qq.com");
 3         return new ApiInfo(
 4                 "dz的SwaggerAPI文档",    //标题
 5                 "我要学习",               //描述  
 6                 "1.0",                   //版本
 7                 "https://www.cnblogs.com/lxzlovewyq/",      //组织连接
 8                 contact,        //联系人信息
 9                 "Apache 2.0",       //许可
10                 "http://www.apache.org/licenses/LICENSE-2.0",    //许可连接
11                 new ArrayList());         //扩展
12     }

 

3.Docket实例关联apiInfo()

1  @Bean
2     public Docket docket(){
3         return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo());
4     }

 

4.重启项目,访问测试:http://localhost:8080/swagger-ui.html#/ 查看效果

 

 

4.配置扫描接口

1.构建Docket时通过select()方法配置怎么扫描接 

 

 1 @Bean
 2 public Docket docket(){
 3         return new Docket(DocumentationType.SWAGGER_2)
 4                 .apiInfo(apiInfo())
 5                 //.select()方法,去配置扫描接口,RequestHandlerSelectors配置如何扫描接口
 6                 .select()
 7                 //any()   扫描所有,项目中的所有接口都会被扫描到
 8                 //none()  不扫描接口
 9                 .apis(RequestHandlerSelectors.basePackage("com.dz.swagger.controller"))
10                 .build();
11     }

 

 

 

 

2.重启项目测试,由于我们配置,根据包的路径扫描接口,所以我们只能看到一个类

 

 3.除了通过包路径配置扫描接口外,还可以通过配置其他方式扫描接口,这里注解一下所有的配置方式

1 any() // 扫描所有,项目中的所有接口都会被扫描到 
2 none() // 不扫描接口 
3 // 通过方法上的注解扫描,如withMethodAnnotation(GetMapping.class)只扫描get请求 
4 withMethodAnnotation(final Class<? extends Annotation> annotation) 
5 // 通过类上的注解扫描,如.withClassAnnotation(Controller.class)只扫描有 controller注解的类中的接口 
6 withClassAnnotation(final Class<? extends Annotation> annotation) 
7 basePackage(final String basePackage) // 根据包路径扫描接口

 

4.除此之外,我们还可以配置接口扫描过滤:

 1 @Bean
 2     public Docket docket(){
 3         return new Docket(DocumentationType.SWAGGER_2)
 4                 .apiInfo(apiInfo())
 5                 //.select()方法,去配置扫描接口,RequestHandlerSelectors配置如何扫描接口
 6                 .select()
 7                 .apis(RequestHandlerSelectors.basePackage("com.dz.swagger.controller"))
 8                 //配置如何通过path过滤,这里只扫描请求以/kuang开头的接口
 9                 .paths(PathSelectors.ant("/dz/**"))
10                 .build();
11     }

 

 

 

 

5.这里可选值还有

1 any() // 任何请求都扫描
2 none() // 任何请求都不扫描 
3 regex(final String pathRegex) // 通过正则表达式控制 
4 ant(final String antPattern) // 通过ant()控制

 

5.配置开关Swagger

1.通过enable()方法配置是否启动swagger,如果是false,swagger将不能再浏览器中访问

 1 @Bean
 2     public Docket docket(){
 3         return new Docket(DocumentationType.SWAGGER_2)
 4                 .apiInfo(apiInfo())
 5                 .enable(false) //配置是否启用Swagger,如果是false,在浏览器将无法访问
 6                 //.select()方法,去配置扫描接口,RequestHandlerSelectors配置如何扫描接口
 7                 .select()
 8                 .apis(RequestHandlerSelectors.basePackage("com.dz.swagger.controller"))
 9                 //配置如何通过path过滤,这里只扫描请求以/kuang开头的接口
10                 .paths(PathSelectors.ant("/dz/**"))
11                 .build();
12     }

 

 

2.如何动态配置当项目处于test、dev环境时显示swagger,处于prod时不显示?

 1    @Bean
 2     public Docket docket(Environment environment){
 3         //设置要显示swagger的环境
 4         Profiles flag = Profiles.of("dev", "test");
 5         //判断当前是否处于该环境
 6         //通过enable()接收此参数判断是否要显示
 7         boolean b = environment.acceptsProfiles(flag);
 8         return new Docket(DocumentationType.SWAGGER_2)
 9                 .apiInfo(apiInfo())
10                 .enable(b)
11                 //.select()方法,去配置扫描接口,RequestHandlerSelectors配置如何扫描接口
12                 .select()
13                 .apis(RequestHandlerSelectors.basePackage("com.dz.swagger.controller"))
14                 //配置如何通过path过滤,这里只扫描请求以/kuang开头的接口
15                 .paths(PathSelectors.ant("/dz/**"))
16                 .build();
17     }

 

3.添加dev和test环境配置

application.properties

1 spring.profiles.active=dev

 

application-dev.properties

1 server.port=8081

 

application-dev.properties

1 server.port=8082

 

4.访问网址:http://localhost:8081/swagger-ui.html#/

 

6.配置API分组

1.如果没有配置分组,默认是default.通过groupName()方法即可配置分组

 1 @Bean
 2     public Docket docket(Environment environment){
 3         //设置要显示swagger的环境
 4         Profiles flag = Profiles.of("dev", "test");
 5         //判断当前是否处于该环境
 6         //通过enable()接收此参数判断是否要显示
 7         boolean b = environment.acceptsProfiles(flag);
 8         return new Docket(DocumentationType.SWAGGER_2)
 9                 .apiInfo(apiInfo())
10                 .groupName("hello")//配置分组
11                 .enable(b)
12                 //.select()方法,去配置扫描接口,RequestHandlerSelectors配置如何扫描接口
13                 .select()
14                 .apis(RequestHandlerSelectors.basePackage("com.dz.swagger.controller"))
15                 //配置如何通过path过滤,这里只扫描请求以/kuang开头的接口
16                 .paths(PathSelectors.ant("/dz/**"))
17                 .build();
18     }

 

2.重启项目查看分组

 

3.如何配置多个分组?

配置多个分组只需要配置多个docket即可

 1 @Bean
 2     public Docket docket1(){
 3         return new Docket(DocumentationType.SWAGGER_2).groupName("group1");
 4     }
 5     @Bean
 6     public Docket docket2(){
 7         return new Docket(DocumentationType.SWAGGER_2).groupName("group2");
 8     }
 9     @Bean
10     public Docket docket3(){
11         return new Docket(DocumentationType.SWAGGER_2).groupName("group3");
12     }

 

4.重启项目查看

 

7.实体配置

1.新建一个实体类

1 @ApiModel("用户实体")
2 public class User {
3     @ApiModelProperty("用户名")
4     public String username;
5     @ApiModelProperty("密码")
6     public String password;
7 }

 

2.只要这个实体在请求接口的返回值上(即使是泛型),都能映射到实体项中        controller

1  @PostMapping("/getUser")
2     public User getUser(){
3         return new User();
4     }

 

3.重启查看测试

 

 注:并不是因为@ApiModel这个注解让实体显示在这里了,而是只要出现在接口方法的返回值上的实体都会显示在这里,而@ApiModel和@ApiModelProperty这两个注解只是为实体添加注释的。

@ApiModel为类添加注解

@ApiModelProperty为属性添加注解

8.常用注解

Swagger的所有注解定义在io.swagger.annotation包下

下面列一些经常用到的,其他的另行查询

 

 我们给请求的接口配置一些注解

1  @ApiOperation("dz的接口")
2     @PostMapping("/dz")
3     @ResponseBody
4     public String dz(@ApiParam("这个名字会被返回") String username){
5         return username;
6     }

 

 

 这样的话,可以给一些比较难理解的属性或者接口,增加一些配置信息,让人更容易阅读

相较于传统的Postman或者Curl方式测试接口,使用Swagger简直就是傻瓜式操作,不需要额外说明文档(写的好本身就是文档)而且更不容易出错,只需要录入数据然后点击Execute,如果在配合自动化框架,可以说基本就不需要人为操作了

Swagger是一个优秀的工具,现在国内已经有很多的中小型互联网公司都在使用它,相较于传统的药先出word接口文档在测试的方式,显然这样也更符合现在的快速迭代开发行情。

在正式环境要记得关闭Swagger,一来出于安全考虑二来可以节省运行时内存。

9.其他皮肤

我们可以导入不同的包实现不同的皮肤定义

1.默认的      访问地址:http://localhost:8080/swagger-ui.html

1 <dependency> 
2     <groupId>io.springfox</groupId> 
3     <artifactId>springfox-swagger-ui</artifactId>         
4     <version>2.9.2</version> 
5 </dependency>

 

2.bootstrap-ui       访问地址:http://localhost:8080/doc.html

1 <dependency>
2             <groupId>com.github.xiaoymin</groupId>
3             <artifactId>swagger-bootstrap-ui</artifactId>
4             <version>1.9.1</version>
5         </dependency>

 

3.Layui-ui          访问地址:http://localhost:8080/docs.html

1 <dependency>
2             <groupId>com.github.caspar-chen</groupId>
3             <artifactId>swagger-ui-layer</artifactId>
4             <version>1.1.3</version>
5 </dependency>

 

4.mg-ui       访问地址:http://localhost:8080/document.html

1 <dependency>
2             <groupId>com.zyplayer</groupId>
3             <artifactId>swagger-mg-ui</artifactId>
4             <version>1.0.6</version>
5         </dependency>

 

posted @ 2020-09-06 21:18  罗晓峥  阅读(261)  评论(0)    收藏  举报