【Swagger】Spring Boot中使用

导读:本篇文章讲解 【Swagger】Spring Boot中使用,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

鸣谢:https://developer.ibm.com/zh/articles/j-using-swagger-in-a-spring-boot-project/

完整代码: https://github.com/ganchaoyang/spring-tutorial/tree/master/sb-swagger

1.准备SpringBootWeb项目

在这一步我们将准备一个基础的 Spring Boot 的 Web 项目,并且提供后面所需要的所有 API。

1.1创建一个空的 Spring Boot 项目

参考文章:https://editor.csdn.net/md/?articleId=114417791

1.2添加依赖

由于创建的是一个 Web 项目,所以我们需要依赖 Spring Boot 的 Web 组件,只需要在 pom.xml 增加如下内容即可:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

1.3编写接口

1.3.1首先我们创建三个包

  • cn.itweknow.sbswagger.controller

  • cn.itweknow.sbswagger.testcontroller

  • cn.itweknow.sbswagger.model

在这里插入图片描述

1.3.2 在 controller 包下新建 UserController.java

package cn.itweknow.sbswagger.controller;

import cn.itweknow.sbswagger.model.User;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;

/**
 * Created by 背影男神 on 2021/3/5.
 */
@RestController
@RequestMapping("/user")
@Api(tags = "用户相关接口", description = "提供用户相关的Rest API" )
public class UserController {
    @ApiOperation("新增用户接口")
    @PostMapping("/add")
    public boolean addUser(@RequestBody User user){
        return false;
    }

    @ApiOperation("通过id查找用户接口")
    @GetMapping("/find/{id}")
    public User findById(@PathVariable("id") int id){
        return new User();
    }

    @ApiOperation("更新用户信息接口")
    @PutMapping("update")
    public boolean update(@RequestBody User user){
        return true;
    }

    @ApiOperation("删除用户接口")
    @DeleteMapping("delete/id")
    @ApiIgnore
    public boolean delete(@PathVariable("id") int id){
        return true;
    }
}


1.3.3 在 testcontroller 包下新建 TestController.java 类

package cn.itweknow.sbswagger.testcontroller;

import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created by 背影男神 on 2021/3/5.
 */
@RestController
@RequestMapping("/test")
@Api(tags = "测试相关接口", description = "提供测试相关的Rest APi")
public class TestController {

    @GetMapping("/test")
    public void test(){
        System.out.println("test");
    }
}


1.3.4 在 model 包下新建 User.java 类

package cn.itweknow.sbswagger.model;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

/**
 * Created by 背影男神 on 2021/3/5.
 */
@ApiModel("用户实体")
public class User {
    /**
     * 用户Id
     */
    @ApiModelProperty("用户id")
    private int id;

    /**
     * 用户名
     */
    @ApiModelProperty("用户姓名")
    private String name;

    /**
     * 用户地址
     */
    @ApiModelProperty("用户地址")
    private String address;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

2. 集成Swagger2

经过上面的步骤,我们已经拥有了五个接口,分别是:

  1. /user/add:新增用户。
  2. /user/find/{id}:根据 id 查询用户。
  3. /user/update:更新用户。
  4. /user/delete/{id}:根据 id 删除用户。
  5. /test/test:测试接口。

下面我们将通过集成 Swagger2,然后为这 5 个 Rest API 自动生成接口文档。

2.1 添加依赖

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
</dependency>

2.2 Java配置

Springfox 提供了一个 Docket 对象,让我们可以灵活的配置 Swagger 的各项属性。

新建一个cn.itweknow.sbswagger.conf.SwaggerConfig.java 类,并增加如下内容:

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.any())
                .build();
    }
}

注意:
@Configuration 是告诉 Spring Boot 需要加载这个配置类
@EnableSwagger2 是启用 Swagger2,如果没加的话自然而然也就看不到后面的验证效果了。

2.3.验证

在这里插入图片描述
在这里插入图片描述

至此,我们已经成功的在 Spring Boot 项目中集成了 Swagger2,启动项目后,我们可以通过在浏览器中访问 http://localhost:8080/v2/api-docs 来验证,您会发现返回的结果是一段 JSON 串,可读性非常差。幸运的是 Swagger2 为我们提供了可视化的交互界面 SwaggerUI,下面我们就一起来试试吧。

3.集成Swagger UI

3.1 添加依赖

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.9.2</version>
</dependency>

3.2 访问验证

其实就只需要添加一下依赖就可以了,我们重新启动一下项目,然后在浏览器中访问 http://localhost:8080/swagger-ui.html 就可以看到如下的效果了:
在这里插入图片描述

可以看到虽然可读性好了一些,但对接口的表述还不是那么的清楚,接下来我们就通过一些高级配置,让这份文档变的更加的易读。

4. 高级配置

4.1 文档相关描述配置

1.通过在控制器类上增加 @Api 注解,可以给控制器增加描述和标签信息。

@Api(tags = "用户相关接口", description = "提供用户相关的 Rest API")
public class UserController

2.通过在接口方法上增加 @ApiOperation 注解来展开对接口的描述,当然这个注解还可以指定很多内容,我们在下面的相关注解说明章节中详细解释。

@ApiOperation("新增用户接口")
@PostMapping("/add")
public boolean addUser(@RequestBody User user) {
    return false;
}

3.实体描述,我们可以通过 @ApiModel 和 @ApiModelProperty 注解来对我们 API 中所涉及到的对象做描述。

@ApiModel("用户实体")
public class User {
    @ApiModelProperty("用户 id")
private int id;
}

4.文档信息配置,Swagger 还支持设置一些文档的版本号、联系人邮箱、网站、版权、开源协议等等信息,但与上面几条不同的是这些信息不是通过注解配置,而是通过创建一个 ApiInfo 对象,并且使用 Docket.appInfo() 方法来设置,我们在 SwaggerConfig.java 类中新增如下内容即可。

@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
            .apis(RequestHandlerSelectors.any())
            .paths(PathSelectors.any())
            .build()
            .apiInfo(apiInfo());
}
private ApiInfo apiInfo() {
return new ApiInfo(
            "Spring Boot 项目集成 Swagger 实例文档",
            "我的博客网站:https://itweknow.cn,欢迎大家访问。",
            "API V1.0",
            "Terms of service",
            new Contact("名字想好没", "https://itweknow.cn", "gancy.programmer@gmail.com"),
                "Apache", "http://www.apache.org/", Collections.emptyList());
}

经过上面的步骤,我们的文档将会变成下图的样子,现在看起来就清楚很多了。

在这里插入图片描述

4.2 接口过滤

有些时候我们并不是希望所有的 Rest API 都呈现在文档上,这种情况下 Swagger2 提供给我们了两种方式配置,一种是基于 @ApiIgnore 注解,另一种是在 Docket 上增加筛选。

1.@ApiIgnore 注解。

如果想在文档中屏蔽掉删除用户的接口(user/delete),那么只需要在删除用户的方法上加上 @ApiIgnore 即可。

@ApiIgnore
public boolean delete(@PathVariable("id") int id)

2.在 Docket 上增加筛选。Docket 类提供了 apis() 和 paths() 两个方法来帮助我们在不同级别上过滤接口:

  • apis() :这种方式我们可以通过指定包名的方式,让 Swagger 只去某些包下面扫描。
  • paths() :这种方式可以通过筛选 API 的 url 来进行过滤。

在集成 Swagger2 的章节中我们这两个方法指定的都是扫描所有,没有指定任何过滤条件。如果我们在我们修改之前定义的 Docket 对象的 apis() 方法和 paths() 方法为下面的内容,那么接口文档将只会展示 /user/add 和 /user/find/{id} 两个接口。

.apis(RequestHandlerSelectors.basePackage("cn.itweknow.sbswagger.controller"))
.paths(Predicates.or(PathSelectors.ant("/user/add"),
        PathSelectors.ant("/user/find/*")))

在这里插入图片描述

4.3 自定义响应消息

Swagger 允许我们通过 Docket 的 globalResponseMessage() 方法全局覆盖 HTTP 方法的响应消息,但是首先我们得通过 Docket 的 useDefaultResponseMessages 方法告诉 Swagger 不使用默认的 HTTP 响应消息,假设我们现在需要覆盖所有 GET 方法的 500 和 403 错误的响应消息,我们只需要在 SwaggerConfig.java 类中的 Docket Bean 下添加如下内容:

.useDefaultResponseMessages(false)
.globalResponseMessage(RequestMethod.GET, newArrayList(
new ResponseMessageBuilder()
              .code(500)
              .message("服务器发生异常")
              .responseModel(new ModelRef("Error"))
              .build(),
       new ResponseMessageBuilder()
              .code(403)
              .message("资源不可用")
              .build()
));

添加如上面的代码后,如下图所示,您会发现在 SwaggerUI 页面展示的所有 GET 类型请求的 403 以及 500 错误的响应消息都变成了我们自定义的内容。
在这里插入图片描述

5.Swagger UI 的使用

5.1 接口查看

SwaggerUI 会以列表的方式展示所有扫描到的接口,初始状态是收缩的,我们只需要点击展开就好,而且会在左边标识接口的请求方式(GET、POST、PUT、DELETE 等等)。
在这里插入图片描述

5.2 接口调用

如下图所示,点击接口展开后页面右上角的 Try it out 按钮后,页面会变成如图所示:
在这里插入图片描述

SwaggerUI 会给我们自动填充请求参数的数据结构,我们需要做的只是点击 Execute 即可发起调用

在这里插入图片描述

5.3 Model

如下图所示,SwaggerUI 会通过我们在实体上使用的 @ApiModel 注解以及 @ApiModelProperty 注解来自动补充实体以及其属性的描述和备注。

在这里插入图片描述

6.相关注解说明

在本章节中我将给出一些 Swagger 中常用的注解以及其常用的属性,并对其一一解释,方便您查看。

6.1 Controller 相关注解

@Api: 可设置对控制器的描述。

注解属性 类型 描述
tags String[] 控制器标签。
description String 控制器描述(该字段被申明为过期)。

6.2 接口相关注解

1.@ApiOperation: 可设置对接口的描述。

注解属性 类型 描述
value String 接口说明。
notes String 接口发布说明。
tags Stirng[] 标签。
response Class<?> 接口返回类型。
httpMethod String 接口请求方式。

2.@ApiIgnore: Swagger 文档不会显示拥有该注解的接口。

@ApiImplicitParams: 用于描述接口的非对象参数集。

@ApiImplicitParam: 用于描述接口的非对象参数,一般与 @ApiImplicitParams 组合使用。

表 3. @ApiImplicitParam 主要属性

注解属性 描述
paramType 查询参数类型,实际上就是参数放在那里。取值:path:以地址的形式提交数据,根据 id 查询用户的接口就是这种形式传参;query:Query string 的方式传参;header:以流的形式提交;form:以 Form 表单的形式提交。
dataType 参数的数据类型。取值:Long 和 String
name 参数名字。
value 参数意义的描述。
required 是否必填。取值:true:必填参数;false:非必填参数。

6.3 Model 相关注解

@ApiModel: 可设置接口相关实体的描述。
@ApiModelProperty: 可设置实体属性的相关描述。

表 4. @ApiModelProperty 主要属性

注解属性 类型 描述
value String 字段说明。
name String 重写字段名称。
dataType Stirng 重写字段类型。
required boolean 是否必填。
example Stirng 举例说明。
hidden boolean 是否在文档中隐藏该字段。
allowEmptyValue boolean 是否允许为空。
allowableValues Stirng 该字段允许的值,当我们 API 的某个参数为枚举类型时,使用这个属性就可以清楚地告诉 API 使用者该参数所能允许传入的值。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/117342.html

(0)
seven_的头像seven_bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!