Swagger2

发布于 2022-07-30  3.53k 次阅读


1. Swagger的概述

Swagger的产生背景主要因为前后端分离开发模式的流行。前后端为了的数据传输,必须统一接口数据格式和请求等

接口文档就在这一阶段产生了,它主要解决接口规范问题。让前后端分离开发效率更高,而Swagger就是接口文档的具体落地产品

接口文档的具体产品还有:APIfox,Lkadoc等

1.1 Swagger的简介

Swagger是一套以Open API规则构建的开源工具,可以帮助设计、构建、记录接口文档

Swagger工具包括的组件:

  1. Swagger Editor:基于浏览器编辑器,可以在里面编写Open API接口规范。类似于Markdown具有实时预览描述文件的功能
  2. Swagger UI:将Open API规范呈现为交互式API文档,用可视化UI展示描述文件
  3. Swagger Codegen:将Open API规范生成为服务器存根和客户端库。通过Swagger Codegen可以将描述文件生成html 格式和cwiki形式的接口文档,同时也可以生成多种言语的客户端和服务端代码
  4. Swagger Inspector:和 Swagger UI有点类似,但是可以返回更多信息,也会保存请求的实际参数数据
  5. Swagger Hub:集成了上面所有项月的各个功能,你可以以项目和版本为单位,将你的描述文件上传到Swagger Hub中。在Swagger Hub中可以完成上面项目的所有工作,需要注册账号,分免费版和收费版

    使用Swagger就是把相关信息存储在它定义的描述文件里面(yml或json格式),再通过维护这个描述文件去更新接口文档,以及生成各端代码

1.2 Open API规范

Open API规范(OpenAPI Specification)以前叫做Swagger规范是Rest API的API描述格式

OpenAPI规范(OAS)为REST API定义了一个与语言无关的标准接口,允许人和计算机发现和理解服务的功能,而无需访问源代码、文档或通过网络流量检查

Open API的规范内容:

  1. 每个访问地址的类型
  2. 每个操作的参数,包括输入输出参数
  3. 认证方法
  4. 连接信息,声明,使用团队和其他信息

Open API规范可以使用YAML或JSON格式进行编写

1.3 Springfox

    使用Swagger时如果在版本更新或迭代时,需要更改Swagger的描述文件进行实时更新,但遇到频繁的更新项目版本时描述文件(ymal或json)也需要进行更新,这样增加开发的工作负担。那有没有一种技术能同步项目更新和描述文件更新

    Marty Pitt编写了一个基于Spring的组件swagger-springmvc。Spring-fox就是根据这个项目发展而来的全新项目

Spring-fox的作用:

  • 根据代码生成接口文档,所以在正常进行更新项目时,修改代码即可,它会实时进行生成
  • 利用自身AOP特性,把Swagger集成进来,底层还是Swagger。但是使用起来方便很多

在实际的开发中,都是Spring-for配合Swagger进行文档开发

2. Swagger初体验

① 通过Spring Initializr构建一个SpringBoot项目

② 引入maven依赖

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

③ 启动类

@SpringBootApplication
@EnableSwagger2 //EnableSwagger2是springfox提供的一个注解,代表swagger2相关技术开启。它会扫描当前类所在包及其子包中所有类型注解
public class springapplication {

    public static void main(String[] args) {
        SpringApplication.run(springapplication.class,args);
    }
}

④ 新建一个Controller进行接口文档测试

@RestController
public class swaggertest {

    @GetMapping("/getswagger")
    public String getswagger(String user, Integer password){


        return "Get Mothed Swagger";
    }

    @PostMapping("/postswagger")
    public String postswagger(){


        return "Post Mothed Swagger";
    }

    @RequestMapping("mothedswagger")
    public String mothedswagger(){


        return "Mothed Swagger";
    }
}

⑤ 启动springboot,访问localhost:8080/swagger-ui.html

3. Swagger的常用配置

Swagger配置依赖Decket

3.1 基本信息配置

基本信息配置使用ApiInfo对象进行配置

ApiInfo的方法:

  • contact:设置作者信息
  • title:设置标题
  • description:描述信息
  • version:版本
  • license:协议
  • licenseUrl:协议地址
  • termsOfServiceUrl:服务的条款

例:

@Bean
public Docket docket(){
    //创建一个Docket对象,参数:文件类,这里使用SWAGGER_2类型文档
    Docket docket = new Docket(DocumentationType.SWAGGER_2);
    //API帮助文档的描述信息对象
    ApiInfo apiInfo = new ApiInfoBuilder()
            .contact(//发布者信息
                    new Contact("空想家",//文档发布者名称
                            "https://wql.luoqin.ltd",//文档发布者地址或者企业网站
                            "2562694007@qq.com"))//文档发布者邮箱
            .title("Swagger框架学习帮助文档")//文档发布的标题
            .description("Swagger框架学习帮助文档详细描述 -- Swagger是一个由于开发RestAPI帮助文档的框架")//文档描述
            .version("1.1")//文档发布的版本
            .termsOfServiceUrl()
            .build();
    docket.apiInfo(apiInfo);//将基础信息加入Docket
    return docket;
}

3.2 扫描包配置

扫描包:扫描哪些包下的注解生成接口文档,一种更精细化的操作

该配置使用到docket对象的两个方法:

  1. select():获取docket的选择器,返回ApiSelectorBuilder
  2. apis():设置扫描那个包

例:

@Bean
public Docket docket(){
    Docket docket = new Docket(DocumentationType.SWAGGER_2);

    docket.select()
            .apis(RequestHandlerSelectors.basePackage("com.swg.controller")).build();

    return docket;
}

3.3 路径服务配置

路径服务的含义:规定哪些Url地址范围可以生成接口文档

该配置使用到docket对象的两个方法:

  1. select():获取docket的选择器,返回ApiSelectorBuilder
  2. paths():设置地址匹配规则

例:

@Bean
public Docket docket(){

    Docket docket = new Docket(DocumentationType.SWAGGER_2);
    docket.select()
            .apis(RequestHandlerSelectors.basePackage("com.swg.controller"))
            //PathSelectors.regex正则表达式路径匹配
            .paths(PathSelectors.regex("/swaggerwql/.*")).build();//请求url以/swaggerwql开头的才进行匹配

    return docket;
}

路漫漫其修远兮,吾将上下而求索