简单了解一下 Swagger

坚强是说给别人听的谎言 提交于 2020-08-09 12:17:48

一、Swagger

1、什么是 Swagger ?

  Swagger 是一个规范和完整的框架,用于生成、描述、调用以及可视化的 Restful 风格的 Web 服务。
  简单的理解:是一款 REST API 文档生成工具,生成在线的接口文档,方便接口测试。

2、为什么使用 Swagger?

  前后端分离开发时,为了方便前后端接口调用规范,需要提供一个接口文档,但是维护这个接口文档是一个及其繁琐的事情,可能一不小心就忘记更新该文档从而导致前后端接口调用失败。
  Swagger 就是为了解决这个问题而出现的(在线接口文档),其在接口方法上定义注解,并根据注解形成一个 html 页面,每次接口修改,这个 html 页面就会发生相应的改变,从而保证了接口文档的正确性。通过该 html 页面,可以很方便、清楚的知道这个接口的功能,并测试。

3、SpringBoot 整合 Swagger?

(1)Step1:
  导入依赖 jar 包。

<!-- 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>

 

(2)Step2:
  配置 swagger 插件。
  编写一个配置类,实现 WebMvcConfigurer 接口(可以不实现该接口),用于配置 Swagger 相关信息。
  @EnableSwagger2 用于开启 Swagger。


package com.lyh.test.test_mybatis_plus.config;

import io.swagger.annotations.ApiOperation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SwaggerConfig implements WebMvcConfigurer {

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
            .apiInfo(apiInfo())
            .select()
            // 加了ApiOperation注解的类,才会生成接口文档
            .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
            // 指定包下的类,才生成接口文档
            .apis(RequestHandlerSelectors.basePackage("com.lyh.test.test_mybatis_plus.controller"))
            .paths(PathSelectors.any())
            .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
            .title("Swagger 测试")
            .description("Swagger 测试文档")
            .termsOfServiceUrl("https://www.cnblogs.com/l-y-h/")
            .version("1.0.0")
            .build();
    }
}

 

 

(3)启动服务,并访问 swagger-ui.html 页面。
  访问 http://localhost:8080/swagger-ui.html,显示如下,能够进入在线接口文档页面,由于并没有在方法上添加注解,所以接口方法都没有显示。

 

 

(4)给接口方法添加相关注解。
  由于配置了 @ApiOperation 注解标注的方法才能被扫描到,所以在方法上添加该注解。

@RestController
@RequestMapping("/test_mybatis_plus/user")
public class UserController {
    @Autowired
    private UserService userService;

    @ApiOperation("获取所有用户")
    @GetMapping("/test")
    public Result list() {
        return Result.ok().data("items", userService.list());
    }
}

 

 

(5)重启服务,再次访问 swagger-ui.html 页面。

 

 

 

 

 

 

 

 

二、Swagger 注解、配置

1、Swagger 常用注解

(1)常用注解
  swagger 通过注解去实现接口文档,这些注解可以标注接口名,请求方法,参数,返回信息等。

@Api                标注在 controller 类上,用于修饰 controller
@ApiOperation       标注在接口方法上,用于修饰 接口方法
@ApiParam           标注在接口参数上,用于修饰 参数
@ApiImplicitParam   标注在接口参数上,用于修饰 一个请求参数
@ApiImplicitParams   标注在接口参数上,用于修饰 多个请求参数(@ApiImplicitParam)
@ApiIgnore          标注在方法、参数上,表示忽略该方法、参数
@ApiModel           标注在实体类上,用来修饰实体类
@ApiModelProperty   标注在实体类的属性上,用于修饰实体类的属性。

 

(2)@Api  @ApiOperation @ApiImplicitParam @ApiImplicitParams 举例:

import com.lyh.test.test_mybatis_plus.entity.User;
import com.lyh.test.test_mybatis_plus.service.UserService;
import com.lyh.test.test_mybatis_plus.util.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author lyh
 * @since 2020-05-08
 */
@RestController
@RequestMapping("/test_mybatis_plus/user")
@Api(value = "UserController", tags = "用户接口文档")
public class UserController {
    @Autowired
    private UserService userService;

    @ApiOperation("获取所有用户")
    @GetMapping("/list")
    public Result list() {
        return Result.ok().data("items", userService.list());
    }

    // paramType ="query" 对应 @RequestParam
    // paramType ="path" 对应 @PathVariable
    // paramType ="body" 对应 @RequestBody 不经常用
    // paramType ="header" 对应 @RequestHeader
    @ApiImplicitParams({
            @ApiImplicitParam(name = "id", required = false, value = "用户 ID", paramType ="query", dataType = "Long"),
            @ApiImplicitParam(name = "user", required = false, value = "用户信息", paramType ="body", dataType = "User")
    })
    @ApiOperation("新增用户")
    @PutMapping("/update")
    public Result update(@RequestBody User user, @RequestParam(required = false) Long id) {
        System.out.println("==================");
        System.out.println(id);
        if (userService.save(user)) {
            return Result.ok().message("数据更新成功");
        } else {
            return Result.error().message("数据更新失败");
        }
    }
}

 

 

 

 

(3)@ApiModel  、@ApiModelProperty 举例

@Data
@ApiModel("统一结果返回类结构")
public class Result {
    /**
     * 响应是否成功,true 为成功,false 为失败
     */
    @ApiModelProperty("响应是否成功,true 为成功,false 为失败")
    private Boolean success;

    /**
     * 响应状态码, 200 成功,500 系统异常
     */
    @ApiModelProperty("响应状态码, 200 成功,500 系统异常")
    private Integer code;

    /**
     * 响应消息
     */
    @ApiModelProperty("响应消息")
    private String message;

    /**
     * 响应数据
     */
    @ApiModelProperty("响应数据")
    private Map<String, Object> data = new HashMap<>();
}

 

 

 

 

2、Swagger 配置

(1)简介
  上面简单了解了下 swagger 常用注解,此处简单介绍一下 swagger 的配置类。

(2)配置类举例
  根据项目情况修改 apiInfo、apis、paths 等信息。
其中:
  apiInfo 用于定义 接口文档的基本信息。
  apis 用于定义 接口扫描规则。
  paths 用于定义 路径过滤规则。




@Configuration
@EnableSwagger2
public class SwaggerConfig implements WebMvcConfigurer {

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
            .apiInfo(apiInfo())
            .select()
            // 加了ApiOperation注解的类,才会生成接口文档
            .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
            // 指定包下的类,才生成接口文档
            .apis(RequestHandlerSelectors.basePackage("com.lyh.test.test_mybatis_plus.controller"))
            .paths(PathSelectors.any())
            .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
            .title("Swagger 测试")
            .description("Swagger 测试文档")
            .termsOfServiceUrl("https://www.cnblogs.com/l-y-h/")
            .version("1.0.0")
            .build();
    }
}

 

(3)分析
Step1:简单了解一下注解。
  @EnableSwagger2 注解用于开启 swagger。
  @Bean 注解标注 createRestApi 方法用于实例 Docket 对象(文档插件)并交给 Spring 容器进行管理。


Step2:简单了解一下 apiInfo。
  该方法用于定义 API 文档的基本信息。

【属性简单介绍:】
    title                  标题,默认为 Api Documentation
    version                版本,默认为 1.0
    description            描述信息,默认为 Api Documentation
    termsOfServiceUrl      服务地址,默认为 urn:tos
    license                许可证,默认为 Apache 2.0
    licenseUrl             许可证地址,默认为 http://www.apache.org/licenses/LICENSE-2.0
    contact                定义作者信息

【举例:】

private ApiInfo apiInfo() {
    return new ApiInfoBuilder()
        .title("后台管理系统 API 文档")
        .description("本文档描述了后台管理系统相关接口的定义")
        .termsOfServiceUrl("https://www.cnblogs.com/l-y-h/")
        .version("1.0.0")
        .contact(new Contact("lyh", "https://www.cnblogs.com/l-y-h/", "13865561381@163.com"))
        .build();
}

 

 

Step3:简单了解一下 Docket
  Docket 实现了 DocumentationPlugin 接口,即文档插件。
  Docket 常用方法介绍。

【Docket 常用方法:】
    apiInfo()              用于定义接口文档的基本信息。
    enabled()              用于定义 swagger 是否使用。
    select()               实例化一个 ApiSelectorBuilder,调用其 build 方法返回一个 Docket 对象。 
    
【ApiSelectorBuilder 常用方法:】
    apis()                 用于定义接口扫描方式(可以使用 RequestHandlerSelectors 指定扫描规则)
    paths()                用于过滤路径(可以使用 PathSelectors 去指定过滤规则)。
    build()                返回一个 Docket 对象
注:
    RequestHandlerSelectors 常用方法:
       any()                     扫描全部
       none()                    全部不扫描
       withMethodAnnotation()    根据方法上的注解扫描
       withClassAnnotation()     根据类上的注解扫描
       basePackage()              指定要扫描的包
  
   PathSelectors 常用方法:
       any()                      全部通过
       none()                     全部不通过
       regex()                    根据正则表达式匹配是否通过
       
【举例:】

@Configuration
@EnableSwagger2
public class SwaggerConfig implements WebMvcConfigurer {
    @Value("${spring.profiles.active:#{null}}")
    private String env;

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
            .apiInfo(apiInfo())
            // 指定是否开启 swagger(如下,生产环境时不执行 swagger)
            .enable("prod".equals(env) ? false : true)
            // 指定分组名
            .groupName("user")
            .select()
            // 加了ApiOperation注解的类,才会生成接口文档
            .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
            // 指定包下的类,才生成接口文档
            .apis(RequestHandlerSelectors.basePackage("com.lyh.test.test_mybatis_plus.controller"))
            // 不过滤接口
            .paths(PathSelectors.any())
            .build();
    }
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!