首页 > 其他 > 详细

Swagger 工具

时间:2020-12-20 10:44:24      阅读:29      评论:0      收藏:0      [点我收藏+]

Swagger

Swagger 介绍

1、是一款让你更好的书写API文档的规范且完整框架。

2、提供描述、生产、消费和可视化RESTful Web Service。

3、是由庞大工具集合支撑的形式化规范。这个集合涵盖了从终端用户接口、底层代码库到商业API管理的方方面面

参考 :

Swagger介绍及使用 https://www.jianshu.com/p/349e130e40d5

【工具使用】API表达工具----swagger https://blog.csdn.net/zmh458/article/details/78766895

Swagger 常用注解使用详解 https://blog.csdn.net/wyb880501/article/details/79576784

  • 这里参考其他博文,并加入自己的实践验证使用 Swagger 工具
  • 官网 : https://swagger.io/

SpringBoot集成 3.0.0 版本及以上与 3.0.0 以下版本的区别

3.0.0 版本及以上(都是使用最新的依赖)

  • 项目中使用 swagger 需要 SpringFox

    • 使用 springfox-boot-starter 而不是 springfox-swagger2
// 3.0.0 依赖
<!-- 	https://mvnrepository.com/artifact/io.springfox/springfox-boot-starter -->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
    </dependency>

    // 2.10.5 springfox-swagger2 
    <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.10.5</version>
</dependency>    
  • ui
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>3.0.0</version>
</dependency>
  • SpringBoot 集成

    • 新建 SpringBoot Web 项目

    • 导入 springfox-boot-starter 和 ui 的依赖

    • 编写 Hello 工程

    • 配置 Swagger -----> SwaggerConfig

      这样只是使用 Swagger2 默认值 ,开启 Swagger2 使用 @EnableOpenApi , 3.0.0以下 使用 @EnableSwagger2

package com.yuanhy.demoswagger.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import springfox.boot.starter.autoconfigure.OpenApiAutoConfiguration;
import springfox.boot.starter.autoconfigure.SwaggerUiWebMvcConfigurer;
import springfox.documentation.oas.annotations.EnableOpenApi;
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;

import static springfox.documentation.service.ApiInfo.DEFAULT_CONTACT;

/**
       * @author yuanhy
       * @date 2020-12-19 16:30
       */
@Configuration
@EnableOpenApi //开启 Swagger2
public class SwaggerConfig {

}
      
package springfox.boot.starter.autoconfigure;

import org.springframework.util.StringUtils;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

// tag::swagger-ui-configurer[]
public class SwaggerUiWebMvcConfigurer implements WebMvcConfigurer {
    private final String baseUrl;

    public SwaggerUiWebMvcConfigurer(String baseUrl) {
        this.baseUrl = baseUrl;
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        String baseUrl = StringUtils.trimTrailingCharacter(this.baseUrl, ‘/‘);
        registry.
            addResourceHandler(baseUrl + "/swagger-ui/**")
            .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/")
            .resourceChain(false);
    }

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController(baseUrl + "/swagger-ui/")
            .setViewName("forward:" + baseUrl + "/swagger-ui/index.html");
    }
}
// end::swagger-ui-configurer[]
      

http://localhost:8080/swagger-ui/ 根据源码,这样也是可以的

技术分享图片

SpringBoot 集成 Swagger 配置

  • 自定义配置 Swagger 的 bean 实例 Docket ,在 SwaggerConfig 中增加
    //配置 Swagger docket bean 实例
          @Bean
          public Docket docket(){
              return new Docket(DocumentationType.SWAGGER_2)
                      .apiInfo(apiInfo());
          }
      
          private ApiInfo apiInfo(){
              //作者信息
              Contact contact = new Contact("yuanhy", "http://localhost:8080/swagger-ui/index.html", "xxx@163.com");
              return new ApiInfo(
                      "yuanhy Swagger Api 文档",
                      "Api Documentation",
                      "v1.0",
                      "http://localhost:8080/swagger-ui/index.html",
                      contact,
                      "Apache 2.0",
                      "http://www.apache.org/licenses/LICENSE-2.0",
                      new ArrayList());
          }
  • select 方法扫描接口的方式
    public class RequestHandlerSelectors {
        private RequestHandlerSelectors() {
            throw new UnsupportedOperationException();
        }
    	
        //调用 any方法,表示扫描所有接口
        public static Predicate<RequestHandler> any() {
            return (each) -> {
                return true;
            };
        }
    	 //调用 none 方法,表示所有接口不扫描
        public static Predicate<RequestHandler> none() {
            return (each) -> {
                return false;
            };
        }
    	
        //withMethodAnnotation 基于方法注解扫描
        public static Predicate<RequestHandler> withMethodAnnotation(final Class<? extends Annotation> annotation) {
            return (input) -> {
                return input.isAnnotatedWith(annotation);
            };
        }
    	//withClassAnnotation 基于Class 注解扫描
        public static Predicate<RequestHandler> withClassAnnotation(final Class<? extends Annotation> annotation) {
            return (input) -> {
                return (Boolean)declaringClass(input).map(annotationPresent(annotation)).orElse(false);
            };
        }
  • 为了测试,在非 controller 包下增加一个 MirrorController

技术分享图片

    package com.yuanhy.demoswagger;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @author yuanhy
     * @date 2020-12-19 18:39
     */
    @RestController
    public class MirrorController {
        @GetMapping("/mirror")
        public String mirror(){
            return "mirror";
        }
    }

any 方法,期待结果是 controller 包中的 HelloController 和非 controller 包中的 MirrorController 都出现在 Swagger UI 上

技术分享图片

none 方法,期待结果是 所有接口都不出现在 Swagger UI 上

技术分享图片

basePackage("com.yuanhy.demoswagger.controller") 基于 controller 包扫描,期待的结果只有 HelloController 出现在 UI 上

其他的情况也是一样,不再测试了

  • 需求 : 当配置为生产环境 prod,不允许开启 Swagger ,当为开发环境 dev,允许开启 Swagger

    application.properties

    spring.profiles.active=dev

application-dev.properties 开发环境

    server.port=8081

application-prod.properties 生产环境

    server.port=8082
  • 修改 Docket bean 实例
    //判断监听配置的 profiles 文件是否是 dev ,是的话,返回 true ,将结果作为设置启动 Swagger 的参数,如下面的 enable
    Profiles profiles = Profiles.of("dev");
    boolean flag = environment.acceptsProfiles(profiles);
    
    new Docket(DocumentationType.SWAGGER_2)
                    .apiInfo(apiInfo())
                    //enable 为 false 表示不启用 Swagger
                    .enable(flag)
     @Bean
        public Docket docket(Environment environment){
            //需求 当配置为生产环境 prod,不允许开启 Swagger ,当为开发环境 dev,允许开启 Swagger
            Profiles profiles = Profiles.of("dev");
            boolean flag = environment.acceptsProfiles(profiles);
            return new Docket(DocumentationType.SWAGGER_2)
                    .apiInfo(apiInfo())
                    //enable 为 false 表示不启用 Swagger
                    .enable(flag)
                    .select()
                    /**RequestHandlerSelectors 配置要扫描的接口方式
                     * basePackage 扫描的包
                     * 调用 any方法,表示扫描所有接口
                     * 调用 none 方法,表示所有接口不扫描
                     * withMethodAnnotation 基于方法注解扫描 (GetMapping.class)
                     * withClassAnnotation 基于Class 注解扫描 (RestController.class)
                     * **/
                    .apis(RequestHandlerSelectors.basePackage("com.yuanhy.demoswagger.controller"))
                    //在 apis 基础上过滤
                    //.paths(PathSelectors.ant("/yuanhy"))
                    .build();
        }

当使用生产环境时,结果为不开启 Swagger,如下图

技术分享图片

  • 配置 API 文档分组

    • 使用到 groupName .groupName("yuanhy")
      @Bean
          public Docket docket(Environment environment){
              //需求 当配置为生产环境 prod,不允许开启 Swagger ,当为开发环境 dev,允许开启 Swagger
              Profiles profiles = Profiles.of("dev");
              boolean flag = environment.acceptsProfiles(profiles);
              return new Docket(DocumentationType.SWAGGER_2)
                      .apiInfo(apiInfo())
                      .groupName("yuanhy")
                      //enable 为 false 表示不启用 Swagger
                      .enable(flag)
                      .select()
                      /**RequestHandlerSelectors 配置要扫描的接口方式
                       * basePackage 扫描的包
                       * 调用 any方法,表示扫描所有接口
                       * 调用 none 方法,表示所有接口不扫描
                       * withMethodAnnotation 基于方法注解扫描 (GetMapping.class)
                       * withClassAnnotation 基于Class 注解扫描 (RestController.class)
                       * **/
                      .apis(RequestHandlerSelectors.basePackage("com.yuanhy.demoswagger.controller"))
                      //在 apis 基础上过滤
                      //.paths(PathSelectors.ant("/yuanhy"))
                      .build();
          }

? 多个分组,增加以下 docket bean 配置,可以在以下图片箭头处切换查看不同分组的接口文档,适用多人开发分类

      @Bean
          public Docket docketA() {
              return new Docket(DocumentationType.SWAGGER_2)
                      .groupName("docketA");
          }
      
          @Bean
          public Docket docketB() {
              return new Docket(DocumentationType.SWAGGER_2)
                      .groupName("docketB");
          }
      
          @Bean
          public Docket docketC() {
              return new Docket(DocumentationType.SWAGGER_2)
                      .groupName("docketC");
          }

技术分享图片

  • 实体类配置

    准备一个实体类User
    
      package com.yuanhy.demoswagger.pojo;
      
      /**
         * @author yuanhy
         * @date 2020-12-19 19:44
         */
      public class User {
          private String userName;
          private String password;
      
          public String getUserName() {
              return userName;
          }
      
          public void setUserName(String userName) {
              this.userName = userName;
          }
      
          public String getPassword() {
              return password;
          }
      
          public void setPassword(String password) {
              this.password = password;
          }
      }
        

准备一个接口 UserController

package com.yuanhy.demoswagger.controller;

import com.yuanhy.demoswagger.pojo.User;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

/**
       * @author yuanhy
       * @date 2020-12-19 19:46
       */
@RestController
public class UserController {
  //接口中使用实体类,才会在 Swagger 的 Models 看得到
  @PostMapping("/user")
  public User getUser(){
      return new User("yuanhy","123456");
  }
}

技术分享图片

@ApiModel 对实体类说明,@ApiModelProperty 对实体类属性说明

        @ApiModel("用户实体类")
        public class User {
            @ApiModelProperty("用户名")
            private String userName;
            @ApiModelProperty("密码")
            private String password;
        
            public User(String userName, String password) {
                this.userName = userName;
                this.password = password;
            }
        }

技术分享图片

@ApiOperation 定义接口方法用途 ,@ApiParam 定义方法参数含义

    @ApiOperation("对某个用户说 Hello")
        @GetMapping("/helloUser")
        public String sayHelloToUserNme(@ApiParam("用户名") String userName) {
            return "Hello, " + userName;
        }

技术分享图片

  • 3.0.0 版本以下也是参考以上配置使用

技术分享图片

Swagger 工具

原文:https://www.cnblogs.com/yuanhy/p/14162326.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!