Swagger

Swagger

一、Swagger简介

Swagger

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

二、Swagger使用

1、导入依赖

<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、配置Swagger

2.1、创建配置文件类
@Configuration
// 开启Swagger2的自动配置
@EnableSwagger2 
public class SwaggerConfig {

}
2.2、配置Swagger文档信息

Swagger文档信息封装于ApiInfo类,所以需要创建ApiInfo类实例对象提供Swagger文档信息

2.2.1、ApiInfo类讲解
2.2.1.1、ApiInfo类构造器及其成员变量
public ApiInfo(String title, String description, String version, String termsOfServiceUrl, Contact contact, String license, String licenseUrl, Collection<VendorExtension> vendorExtensions) {
    // 文档主题
    this.title = title;
    // 文档描述
    this.description = description;
    // 文档版本
    this.version = version;
    // 组织链接
    this.termsOfServiceUrl = termsOfServiceUrl;
    // 作者/联系人信息
    // 默认值为:public static final Contact DEFAULT_CONTACT = new Contact("", "", "");
    this.contact = contact;
    // 许可
    this.license = license;
     // 许可连接
    this.licenseUrl = licenseUrl;
    // 扩展
    this.vendorExtensions = new ArrayList(vendorExtensions);
}
2.2.1.2、ApiInfo类默认实例

ApiInfo类初始化的时候就创建了一个默认的ApiInfo实例

public static final ApiInfo DEFAULT; // ApiInfo类的成员变量
static {
    DEFAULT = new ApiInfo("Api Documentation", "Api Documentation", "1.0", "urn:tos", DEFAULT_CONTACT, "Apache 2.0", "http://www.apache.org/licenses/LICENSE-2.0", new ArrayList());
}

这些信息会在首页展示,作为文档信息

请添加图片描述

2.2.1.3、自定义ApiInfo实例

一般情况下不会使用默认的文档信息,而是自己定义文档信息

@Configuration
@EnableSwagger2
public class SwaggerConfig {

    /**
     * 配置Swagger文档信息
     */
    private ApiInfo apiInfo() {
        // 作者信息
        Contact contact = new Contact("bloom", "花海", "1357522235@qq.com")
        return new ApiInfo(
                "接口文档",
                "学习Swagger",
                "1.0",
                "https://mp.weixin.qq.com/s/0-c0MAgtyOeKx6qzmdUG0w",
                contact,
                "Apache 2.0",
                "http://www.apache.org/licenses/LICENSE-2.0",
                new ArrayList());
    }

}
2.2.2、设置文档信息
@Configuration
@EnableSwagger2
public class SwaggerConfig {

    /**
     * 配置Swagger的实例Docket类对象
     *
     * @return {@link Docket}
     */
    @Bean
    public Docket docket() {
        return new Docket(DocumentationType.SWAGGER_2)
                // 配置文档信息
                .apiInfo(apiInfo())
                .build();
    }

    /**
     * 配置Swagger文档信息
     */
    private ApiInfo apiInfo() {
        // 作者信息
        Contact contact = new Contact("bloom", "花海", "1357522235@qq.com");
        return new ApiInfo(
                "接口文档",
                "学习Swagger",
                "1.0",
                "https://mp.weixin.qq.com/s/0-c0MAgtyOeKx6qzmdUG0w",
                contact,
                "Apache 2.0",
                "http://www.apache.org/licenses/LICENSE-2.0",
                new ArrayList());
    }

}
2.3、创建Swagger实例Docket
*2.3.1、Docket类讲解
2.3.1.1、Docket类构造器及其成员变量
public Docket(DocumentationType documentationType) {
    // 文档信息
    this.apiInfo = ApiInfo.DEFAULT;
    // 组名
    this.groupName = "default";
    // 是否开启Swagger
    this.enabled = true;
    this.genericsNamingStrategy = new DefaultGenericTypeNamingStrategy();
    this.applyDefaultResponseMessages = true;
    this.host = "";
    this.pathMapping = Optional.absent();
    // api接口扫描器 由Docket中select方法创建的ApiSelectorBuilder建造者建造的
    this.apiSelector = ApiSelector.DEFAULT;
    this.enableUrlTemplating = false;
    this.vendorExtensions = Lists.newArrayList();
    this.documentationType = documentationType;
}
2.3.1.2、Docket构造器中DocumentationType类

在Docket类构造器中需要传入DocumentationType类对象,这个对象是表明使用Swagger文档的版本和类型,它有三个常量,这里选择SWAGGER_2

public class DocumentationType extends SimplePluginMetadata {
    public static final DocumentationType SWAGGER_12 = new DocumentationType("swagger", "1.2");
    public static final DocumentationType SWAGGER_2 = new DocumentationType("swagger", "2.0");
    public static final DocumentationType SPRING_WEB = new DocumentationType("spring-web", "1.0");
    private final MediaType mediaType;
    // ...
}
2.3.1.3、Docket中的select方法(建造者模式)

当Docket对象调用select方法时会返回ApiSelectorBuilder建造者对象

public ApiSelectorBuilder select() {
    return new ApiSelectorBuilder(this);
}

这个ApiSelectorBuilder建造者需要建造三个组成部分

  1. Docket对象
  2. 请求扫描器
  3. 路径扫描器
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package springfox.documentation.spring.web.plugins;

import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import springfox.documentation.RequestHandler;
import springfox.documentation.spi.service.contexts.ApiSelector;

public class ApiSelectorBuilder {
    // Docket对象
    private final Docket parent;
    // 请求扫描器
    private Predicate<RequestHandler> requestHandlerSelector;
    // 路径扫描器
    private Predicate<String> pathSelector;

    public ApiSelectorBuilder(Docket parent) {
        // 若用户没有其它需求,这里会使用默认的ApiSelector.DEFAULT中提供的请求扫描器
        this.requestHandlerSelector = ApiSelector.DEFAULT.getRequestHandlerSelector();
        // 若用户没有其它需求,这里会使用默认的ApiSelector.DEFAULT中提供的路径扫描器
        this.pathSelector = ApiSelector.DEFAULT.getPathSelector();
        // return new ApiSelectorBuilder(this);
        this.parent = parent;
    }
    
    /**
    * 请求扫描器具体的建造方法
    * 用户可以根据需求建造该部分,通常是配置
    */
    public ApiSelectorBuilder apis(Predicate<RequestHandler> selector) {
        this.requestHandlerSelector = Predicates.and(this.requestHandlerSelector, selector);
        return this;
    }

    public ApiSelectorBuilder paths(Predicate<String> selector) {
        this.pathSelector = Predicates.and(this.pathSelector, selector);
        return this;
    }

    public Docket build() {
        return this.parent.selector(new ApiSelector(this.combine(this.requestHandlerSelector, this.pathSelector), this.pathSelector));
    }

    private Predicate<RequestHandler> combine(Predicate<RequestHandler> requestHandlerSelector, Predicate<String> pathSelector) {
        return Predicates.and(requestHandlerSelector, this.transform(pathSelector));
    }

    private Predicate<RequestHandler> transform(final Predicate<String> pathSelector) {
        return new Predicate<RequestHandler>() {
            public boolean apply(RequestHandler input) {
                return Iterables.any(input.getPatternsCondition().getPatterns(), pathSelector);
            }
        };
    }
}

2.3.2、创建Docket对象

RequestHandlerSelectors配置要扫描接口范围

  1. basePackage(“com.bloom.swagger.controller”) 扫描指定包下的接口
  2. any() 扫描所有,项目中的所有接口都会被扫描到
  3. none() 不扫描接口
  4. withMethodAnnotation(GetMapping.class) 通过方法上的注解扫描,如只扫描get请求
  5. withClassAnnotation(final Class<? extends Annotation> annotation) 通过类上的注解扫描,如只扫描有controller注解的类中的接口
@Configuration
@EnableSwagger2
public class SwaggerConfig {

    /**
     * 配置Swagger的实例Docket类对象
     *
     * @return {@link Docket}
     */
    @Bean
    public Docket docket() {
        return new Docket(DocumentationType.SWAGGER_2)
                // 配置文档信息
                .apiInfo(apiInfo())
                // 是否开启Swagger 生产环境就打开,发布时不使用
                .enable(true)
                // 扫描选择器配置 
                .select()
                // RequestHandlerSelectors配置要扫描接口范围
                // 1.basePackage("com.bloom.swagger.controller") 扫描指定包下的接口
                // 2.any() 扫描所有,项目中的所有接口都会被扫描到
                // 3.none() 不扫描接口
                // 4.withMethodAnnotation(GetMapping.class) 通过方法上的注解扫描,如只扫描get请求
                // 5.withClassAnnotation(final Class<? extends Annotation> annotation) 通过类上的注解扫描,如只扫描有controller注解的类中的接口
                .apis(RequestHandlerSelectors.basePackage("com.bloom.swagger.controller"))
                // 过滤什么路径,过滤的路径下的接口不展示
                // 1.ant() 要过滤的路径
                // 2.any()  过滤所有路径
                // 3.none() 不过滤路径
                // 4.regex() 正则表达式
                // .paths(PathSelectors.ant("/bloom/**"))
                .build();
    }

    /**
     * 配置Swagger文档信息
     */
    private ApiInfo apiInfo() {
        // 作者信息
        Contact contact = new Contact("bloom", "花海", "1357522235@qq.com");
        return new ApiInfo(
                "接口文档",
                "学习Swagger",
                "1.0",
                "https://mp.weixin.qq.com/s/0-c0MAgtyOeKx6qzmdUG0w",
                contact,
                "Apache 2.0",
                "http://www.apache.org/licenses/LICENSE-2.0",
                new ArrayList());
    }

}

2.4、配置swagger的启用与关闭
2.4.1、在生产环境启用
2.4.1、在发布环境关闭
2.5、配置Swagger的多个分组

配置多个Docket对象就行

@Bean
public Docket docket1() {
    return new Docket(DocumentationType.SWAGGER_2).groupName("项目组一");
}
@Bean
public Docket docket2() {
    return new Docket(DocumentationType.SWAGGER_2).groupName("项目组二");
}

3、常用注解

3.1、@Api

Api 用在类上,说明该类的作用。可以标记一个Controller类做为swagger 文档资源,

使用方式:

@Api(value = "/user", description = "Operations about user")
public class UserController {
}
参数说明
valueurl的路径值
tags如果设置这个值、value的值会被覆盖
description对api资源的描述
basePath基本路径可以不配置
position如果配置多个Api 想改变显示的顺序位置
hidden配置为true 将在文档中隐藏
3.2、@ApiOperation

ApiOperation:用在方法上,说明方法的作用,每一个url资源的定义,使用方式:

@ApiOperation(
          value = "Find purchase order by ID",
          notes = "For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions",
          response = Order,
          tags = {"Pet Store"})
属性说明
valueurl的路径值
tags如果设置这个值、value的值会被覆盖
description对api资源的描述
position如果配置多个Api 想改变显示的顺序位置
authorizations高级特性认证时配置
hidden配置为true 将在文档中隐藏
response响应类型(即返回对象)
responseContainer声明包装的响应容器(返回对象类型)。有效值为 “List”, “Set” or “Map”。
httpMethod“GET”, “HEAD”, “POST”, “PUT”, “DELETE”, “OPTIONS” and “PATCH”
code响应的HTTP状态代码。默认 200
extensions扩展属性
3.3、@ApiParam
属性说明
name属性名称
value属性值
defaultValue默认属性值
3.4、@ApiModel

用于描述实体类

3.5、@ApiModelProperty

描述实体类属性

3.6、@ApiImplicitParam

用于标识参数

属性说明
name参数名
value参数的具体意义,作用
required参数是否必填
dataType参数的数据类型
3.7、@ApiImplicitParams

用于标识多个参数

@PostMapping("/register")
@ApiOperation(value = "用户注册", notes = "APP用户注册")
@ApiImplicitParams({
        @ApiImplicitParam(name = "mobile", value = "手机号码", dataType = "string", paramType = "query", example = "13802780104", required = true),
        @ApiImplicitParam(name = "user_name", value = "登录账号", dataType = "string", paramType = "query", example = "lihailin9073", required = true),
        @ApiImplicitParam(name = "password", value = "登录密码", dataType = "string", paramType = "query", example = "123456", required = true),
        @ApiImplicitParam(name = "validate_code", value = "注册验证码", dataType = "string", paramType = "query", example = "3679", required = true)
})
public Object create() {
    Map<String,Object> map = new HashMap<>();
    map.put("list", null);
    return map;
}
3.8、@ApiIgnore

4、访问文档

http://localhost/swagger-ui.html

Knife4j

一、Knife4j简介

Knife4j是Swagger的增强工具

knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案。

knife4j属于service模块公共资源,因此我们集成到service-uitl模块

二、Kinfe4j的使用

1、导入依赖

此以来整合了Swagger依赖,当导入此依赖后不需要Swagger的依赖了

<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-spring-boot-starter</artifactId>
    <version>4.0.0</version>
</dependency>

2、配置Knife4j

@Configuration
@EnableSwagger2WebMvc
public class Knife4jConfig {

    /**
     * 配置Swagger的实例Docket类对象
     *
     * @return {@link Docket}
     */
    @Bean
    public Docket docket1() {
        return new Docket(DocumentationType.SWAGGER_2)
                // 配置文档信息
                .apiInfo(apiInfo())
                // 是否开启Swagger 生产环境就打开,发布时不使用
                .enable(true)
                .groupName("项目组一")
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.bloom.swagger.controller"))
                .build();
    }

    /**
     * 配置Swagger文档信息
     */
    private ApiInfo apiInfo() {
        // 作者信息
        Contact contact = new Contact("bloom", "花海", "1357522235@qq.com");
        return new ApiInfo(
                "接口文档",
                "学习Swagger",
                "1.0",
                "https://mp.weixin.qq.com/s/0-c0MAgtyOeKx6qzmdUG0w",
                contact,
                "Apache 2.0",
                "http://www.apache.org/licenses/LICENSE-2.0",
                new ArrayList());
    }
}

3、访问文档

请添加图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值