Swagger入门

Swagger入门

一、什么是Swagger

在实际开发前后端分离项目的过程中,不知道大家有没有这种经历。

前端程序员小李:小王,我掉你接口咋报错了!你这水平是不是不行啊!

后端程序员小王:谁说啦!一看我这写了好久嘞!你才有错呢!

前端程序员小李:你不信你看!你这多了一个属性啊!

小王:您没看接口文档吧!您这都几百年之前的接口文档了!老板早就让我改了你那版了。

小李:敢怒不敢言…加班吧…

相信无论是前端还是后端开发,都或多或少地被接口文档折磨过。前端经常抱怨后端给的接口文档与实际情况不一致。后端又觉得编写及维护接口文档会耗费不少精力,经常来不及更新。其实无论是前端调用后端,还是后端调用后端,都期望有一个好的接口文档。

所以说Swagger就这么一个东西,用来解决接口文档中可能遇到的一些问题。

二、SpringBoot集成Swagger

我们首先创建一个springboot项目,然后导入两个依赖。

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

之后我们创建一个很基本的helloController

package com.dll.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String hello(){
        return "hello";
    }
}

测一下!

image-20201106151617347

It’s ok!

之后我们配置一下swagger。

创建一个swagger-config,里面将他配置到spring容器中。

package com.dll.config;

import org.springframework.context.annotation.Configuration;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
//开启swagger
@EnableSwagger2
public class SwaggerConfig {

}

重启下,我们在项目中来输入一个swagger-ui.html

image-20201106151914899

swagger框被我们分成了以下部分!

image-20201106152103320

三、Swagger配置

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

我们来创建一个Docket实例,并把它注册到容器中。

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

Docket中有一个Apiinfo属性可以配置相关信息,我们这里定制一下。

image-20201106204926734

ApiInfo中有一些我们可以自定义的信息。

image-20201106205041878

这里我们再写一个配置apiInfo的实例。

    @Bean
    public ApiInfo apiInfo(){
        return new ApiInfo(
                "丽丽的swagger配置",
                "我的接口文档",
                "1.0",
                "https://www.bilibili.com/",
                new Contact("zjj","https://www.cueb.edu.cn","s747296681@vip.qq.com"),
                "Apache 2.0",
                "http://www.apache.org/licenses/LICENSE-2.0",
                new ArrayList());
    }

最后改一下上面Docket中的apiInfo。

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

四、配置扫描接口

OK,我们刚才是把项目中所有的接口都扫描了一手。但是假如我只想扫描一小点可不可!
当然可!

构建Docket时可以通过通过select()方法配置怎么扫描接口。

@Bean
public Docket docket() {
    return new Docket(DocumentationType.SWAGGER_2)
        .apiInfo(apiInfo())
        .select()// 通过.select()方法,去配置扫描接口,RequestHandlerSelectors配置如何扫描接口
        .apis(RequestHandlerSelectors.basePackage("com.dll.controller"))//只扫描com.dll.controller包下的接口,很好理解!
        .build();
}

当然除了通过包扫描,RequestHandlerSelectors里面还提供一些其他扫描的方法。

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

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

 public Docket docket(){
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
                .select().apis(RequestHandlerSelectors.basePackage("com.dll.controller"))
                .paths(PathSelectors.ant("/zjj/**")).//只扫描zjj开头的接口
                        build();
    }

这里也有一些其他方法

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

这次配置完应该啥也访问不了了!因为我们没有zjj开头的接口啊!

image-20201106213636828

果然!

五、配置swagger开关

通过enable可以配置swagger开关!

public Docket docket(){
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
                .enable(false)//true为开启,false为关闭
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.dll.controller")).
//                .paths(PathSelectors.ant("/zjj/**")).//只扫描zjj开头的接口
        
                        build();
    }

我们在这里将swagger的开关关闭。

image-20201107143402852

发现无法访问了。

在开发中,我们的项目有很多环境,比如说生产环境啊,测试环境啊,那我们能不能动态的判断他是在什么环境中,并且根据环境来判断他到底开不开启swagger嘞?

当然可。

首先我们将相关环境配置一下,

这里我们创建,dev,test以及prod三种环境,对应端口号为8081,8082,8083

之后我们再配置文件中定义当前为dev环境。

image-20201107143938335

OK,那我们如何获取当前是啥环境嘞?

我们可以通过environment对象来拿。

    @Bean
    public Docket docket(Environment environment){
        //设置一下可以访问的环境
        Profiles of = Profiles.of("dev", "test");
        //判断是不是在of中的test或者dev环境中,若在则返回true,不在返回false
        boolean b = environment.acceptsProfiles(of);

        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
                .enable(b)//true为开启,false为关闭
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.dll.controller"))
                .build();
    }

这时候我们访问8081的dev环境,是完全可以进去的!

image-20201107144705386

而8083的prod环境不可。

image-20201107144917700

六、配置Api分组

在docket中可以配置groupName属性来设置分组。

.groupName("zjj")

image-20201107151711943

那我们如何配置多个分组呢?或者说在多人开发的时候如何让每个人有一个单独的分组嘞?

我们只需要多配置一些Docket就可。

这里我们多配置4个docket。

    @Bean
    public Docket docket1(){
        return new Docket(DocumentationType.SWAGGER_2).groupName("A");
    }
    @Bean
    public Docket docket2(){
        return new Docket(DocumentationType.SWAGGER_2).groupName("B");
    }
    @Bean
    public Docket docket3(){
        return new Docket(DocumentationType.SWAGGER_2).groupName("C");
    }
    @Bean
    public Docket docket4(){
        return new Docket(DocumentationType.SWAGGER_2).groupName("D");
    }

看一下,发现确实多了4个组。

image-20201107152153467

七、实体配置

swagger中不止可以查看接口的信息,我们也可以查看各个实体类的信息。

首先定义用户实体类。

package com.dll.pojo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiParam;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.context.annotation.Bean;

@Data
@AllArgsConstructor
@NoArgsConstructor

//类注释
@ApiModel("用户实体类")
public class User {
    //参数注释
    @ApiModelProperty("用户名")
    private String userName;
    @ApiModelProperty("密码")
    private String pwd;
}

然后记得要在一个controller返回相关的对象哈!

package com.dll.controller;

import com.dll.pojo.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String hello(){
        return "hello";
    }
    @GetMapping("/user1")
    public User user(){
        return new User("张峻杰","789");
    }
}

之后我们就可以在swagger中康到了!

image-20201107154452194

常用的注解。

Swagger注解简单说明
@Api(tags = “xxx模块说明”)作用在模块类上
@ApiOperation(“xxx接口说明”)作用在接口方法上
@ApiModel(“xxxPOJO说明”)作用在模型类上:如VO、BO
@ApiModelProperty(value = “xxx属性说明”,hidden = true)作用在类方法和属性上,hidden设置为true可以隐藏该属性
@ApiParam(“xxx参数说明”)作用在参数、方法和字段上,类似@ApiModelProperty

八、接口测试

我们可以在swagger-ui中进行接口的测试.

点击接口右上角的tryItOut就可以了

image-20201107180208386

我们测一下我们上面写的user1方法。

image-20201107181347969

OK没有问题!

九、自定义UI

bootstrap-ui

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

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

<dependency> 



    <groupId>io.springfox</groupId>



    <artifactId>springfox-swagger-ui</artifactId>



    <version>2.9.2</version>



</dependency>

image-202011071832522772、bootstrap-ui 访问 http://localhost:8080/doc.html

<!-- 引入swagger-bootstrap-ui包 /doc.html-->



<dependency>



    <groupId>com.github.xiaoymin</groupId>



    <artifactId>swagger-bootstrap-ui</artifactId>



    <version>1.9.1</version>



</dependency>

image-20201107183318118

3、mg-ui 访问 http://localhost:8080/document.html

<!-- 引入swagger-ui-layer包 /document.html-->



<dependency>



    <groupId>com.zyplayer</groupId>



    <artifactId>swagger-mg-ui</artifactId>



    <version>1.0.6</version>



</dependency>

image-20201107183406097

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值