Skip to content

Swagger技术

注意

spring-boot 3.x,集成swagger已变得异常简单,直接导入依赖即可,无需添加Java Config类

org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.0

浏览器输入以下网址访问

http://localhost:8080/swagger-ui.html

@Operation可以对API进行描述[方法],@Parameter可以对参数进行描述[参数],它们的目的是用于生成API文档的描述信息。添加了描述的API文档如下:

要自定义文档的样式、控制某些API显示等,请参考

springdoc文档

1. 什么是Swagger

企业实际开发中问题如下:

  • 无论是前端还是后端开发,都或多或少地被接口文档折磨过。
  • 前端经常抱怨后端给的接口文档与实际情况不一致。
  • 后端又觉得编写及维护接口文档会耗费精力,经常来不及更新。
  • 无论是前端调用后端,还是后端调用后端,都期望有一个好的接口文档。
  • 程序员经常会抱怨别人写的代码没有写接口文档.
  • 自己写起代码起来,最讨厌的,就是写接口文档。

如何解决上面所述问题? 可以使用Swagger技术自动生成接口文档!!!

2. 简介

Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务(https://swagger.io/)。 它的主要作用是:

  1. 使得前后端分离开发更加方便,有利于团队协作

  2. 接口的文档在线自动生成,降低后端开发人员编写接口文档的负担

  3. 功能测试

    Spring已经将Swagger纳入自身的标准,建立了Spring-swagger项目,现在叫Springfox。通过在项目中引入Springfox ,即可非常简单快捷的使用Swagger。

3. SpringBoot集成Swagger

3.1. 注意事项

  • 使用软件文件夹中提供的apache-maven-3.3.9

  • 使用软件文件夹中提供的maven本地仓库并配置到idea中

3.2. 集成Swagger

3.2.1 创建maven项目

3.2.2 引入依赖

xml
<!-- 继承Spring boot工程 -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.5.RELEASE</version>
</parent>

<properties>
    <!-- 项目源码及编译输出的编码 -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

    <!-- 项目编译JDK版本 -->
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>

    <!-- 依赖包版本管理 -->
    <spring.boot.version>2.1.5.RELEASE</spring.boot.version>
    <lombok.version>1.18.8</lombok.version>
    <swagger.version>2.9.2</swagger.version>
    <knife4j.version>2.0.2</knife4j.version>
</properties>

<dependencies>
    <!-- Spring boot starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>${spring.boot.version}</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>${lombok.version}</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>${swagger.version}</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>${swagger.version}</version>
    </dependency>
</dependencies>

3.2.3 application.yml

yml
server:
  port: 9001
spring:
  application:
    name: swagger-demo

3.2.4 项目包结构

  • com.futureweaver.config

  • com.futureweaver.pojo

  • com.futureweaver.controller

3.2.5 SpringBoot启动器

java
package com.futureweaver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SwaggerDemoApplication {

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

3.2.6 添加Swagger配置类

java
package com.futureweaver.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
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;

/**
 * Swagger基础配置类
 * 此类相当于配置文件, 项目启动就立即自动加载此类
 */
@Configuration
@EnableSwagger2
public class SwaggerConfiguration {

    @Bean
    public Docket buildDocket() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(buildApiInfo())
                .select()
                // 要扫描的API(Controller)基础包
                .apis(RequestHandlerSelectors.basePackage("com.futureweaver"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo buildApiInfo() {
        Contact contact = new Contact("future-weaver","","");
        return new ApiInfoBuilder()
                .title("future-weaver API文档")
                .description("平台管理服务api")
                .contact(contact)
                .version("1.0.0").build();
    }
}

3.3. 使用Swagger

3.3.1 创建User实体类

java
package com.futureweaver.pojo;

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

import java.util.Date;

/**
 * 用户实体类
 */
@Data
@ApiModel(value="用户实体类", description="请求参数类" )
public class User {

    @ApiModelProperty(value = "主键id", example = "11111")
    private Long id;

    @ApiModelProperty(value = "姓名", example = "张三")
    private String name;

    @ApiModelProperty(value = "年龄", example = "25")
    private Integer age;

    @ApiModelProperty(value = "生日", example = "2021-11-04T13:46:56.711Z")
    private Date birthday;

    @ApiModelProperty(value = "性别", example = "男,女")
    private String sex;

    @ApiModelProperty(value = "是否婚配", example = "true, false")
    private Boolean isMarry;

    @ApiModelProperty(value = "描述信息")
    private String desc;
}

3.3.2 创建Controller测试类

java
package com.futureweaver.controller;

import com.futureweaver.pojo.User;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 用户管理接口
 */
@RestController
@RequestMapping("/api/user")
@Api(value = "用户管理", tags = "SwaggerTestController", description = "用户管理API")
public class SwaggerTestController {

    /**
     * 根据用户id查询指定用户数据
     */
    @ApiOperation("根据用户id查询指定用户数据")
    @GetMapping("/one/{id}")
    public User findById(@PathVariable(value = "id") Long id) {
        User user = new User();
        user.setId(123L);
        user.setName("张三");
        user.setAge(80);
        user.setBirthday(new Date());
        user.setIsMarry(false);
        user.setSex("男");
        return user;
    }

    /**
     * 查询所有用户数据返回
     */
    @ApiOperation("查询所有用户数据返回")
    @GetMapping("/findAll")
    public List<User> findUserAll() {
        //1. 创建用户集合对象
        List<User> userList = new ArrayList<>();

        //2. 创建第一个用户对象
        User user1 = new User();
        user1.setId(111L);
        user1.setName("青龙");
        user1.setAge(80);
        user1.setBirthday(new Date());
        user1.setIsMarry(false);
        user1.setSex("男");

        //3. 创建第二个用户对象
        User user2 = new User();
        user2.setId(222L);
        user2.setName("白虎");
        user2.setAge(25);
        user2.setBirthday(new Date());
        user2.setIsMarry(true);
        user2.setSex("男");

        //4. 创建第三个用户对象
        User user3 = new User();
        user3.setId(333L);
        user3.setName("朱雀");
        user3.setAge(18);
        user3.setBirthday(new Date());
        user3.setIsMarry(false);
        user3.setSex("女");

        //5. 将创建的用户对象存入用户集合中
        userList.add(user1);
        userList.add(user2);
        userList.add(user3);

        //6. 返回用户集合对象
        return userList;
    }

    /**
     * 添加新用户
     * @param user
     */
    @ApiOperation("添加新用户")
    @PostMapping("/add")
    public void addUser(@RequestBody User user) {
        System.out.println("====" + user);
        System.out.println("=====添加用户成功=====");
    }

    /**
     * 根据用户主键id修改用户属性
     * @param user
     */
    @ApiOperation("根据id修改用户属性")
    @PutMapping("/edit")
    public void editUser(@RequestBody User user) {
        System.out.println("====" + user);
        System.out.println("=====修改用户成功=====");
    }

    /**
     * 根据id删除用户
     */
    @ApiOperation("删除用户")
    @DeleteMapping("/del/{id}")
    public void delbyId(@PathVariable(value = "id") Long id) {
        System.out.println("======删除用户成功=====");
    }
}

4. Swagger常用注解

在Java类中添加Swagger的注解即可生成Swagger接口文档,常用Swagger注解如下:

@Api:修饰整个类,描述Controller的作用

@ApiOperation:描述一个类中的一个方法

@ApiParam:单个参数的描述信息

@ApiModel:用对象来接收参数

@ApiModelProperty:用对象接收参数时,描述对象的一个字段

@ApiResponse:HTTP响应其中1个描述

@ApiResponses:HTTP响应整体描述

@ApiIgnore:使用该注解忽略这个API

@ApiError :发生错误返回的信息

@ApiImplicitParam:一个请求参数

@ApiImplicitParams:多个请求参数的描述信息

@ApiImplicitParam属性:

属性取值作用
paramType查询参数类型
path以地址的形式提交数据
query直接跟参数完成自动映射赋值
body以流的形式提交 仅支持POST
header参数在request headers 里边提交
form以form表单的形式提交 仅支持POST
dataType参数的数据类型 只作为标志说明,并没有实际验证
Long
String
name接收参数名
value接收参数的意义描述
required参数是否必填
true必填
false非必填
defaultValue默认值

5. 启动项目测试

启动swaggerDemo微服务

访问地址:http://localhost:9001/swagger-ui.html

  • 点击标签出现接口列表

添加用户接口:

先点击Try it out 输入参数,然后点击Execute,结果如下:

参考资料

https://www.liaoxuefeng.com/wiki/1252599548343744/1283318525984802

https://springdoc.org/