Swagger技术使用
1.1. 什么是Swagger
企业实际开发中问题如下:
- 无论是前端还是后端开发,都或多或少地被接口文档折磨过。
- 前端经常抱怨后端给的接口文档与实际情况不一致。
- 后端又觉得编写及维护接口文档会耗费精力,经常来不及更新。
- 无论是前端调用后端,还是后端调用后端,都期望有一个好的接口文档。
- 程序员经常会抱怨别人写的代码没有写接口文档.
- 自己写起代码起来,最讨厌的,就是写接口文档。
如何解决上面所述问题? 可以使用Swagger技术自动生成接口文档!!!
1.2. 简介
Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务(swagger.io/)。 它的主要作用是:
-
使得前后端分离开发更加方便,有利于团队协作
-
接口的文档在线自动生成,降低后端开发人员编写接口文档的负担
-
功能测试
Spring已经将Swagger纳入自身的标准,建立了Spring-swagger项目,现在叫Springfox。通过在项目中引入Springfox ,即可非常简单快捷的使用Swagger。
1.3. SpringBoot集成Swagger
1.3.1. 注意事项
- 使用软件文件夹中提供的apache-maven-3.3.9
- 使用软件文件夹中提供的maven本地仓库并配置到idea中
1.3.2. 集成Swagger操作步骤
- 创建测试项目SwaggerDemo项目, 必须创建maven项目, 不要选择骨架
- 引入依赖到pom.xml中
<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>
在项目的src/main/resources目录下添加配置文件application.yml
port: 9001
spring:
application:
name: swagger-demo
-
在项目的src/main/java目录下创建包结构
com.qianfeng.config
com.qianfeng.pojo
com.qianfeng.controller
-
在com.qianfeng目录下创建启动类SwaggerDemoApplication.java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 项目启动类
* @Author zhaojian
*/
@SpringBootApplication
public class SwaggerDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SwaggerDemoApplication.class, args);
}
}
在项目的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基础配置类
* 此类相当于配置文件, 项目启动就立即自动加载此类
*
* @author zhaojian
*/
@Configuration
@EnableSwagger2
public class SwaggerConfiguration {
@Bean
public Docket buildDocket() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(buildApiInfo())
.select()
// 要扫描的API(Controller)基础包
.apis(RequestHandlerSelectors.basePackage("com.qianfeng"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo buildApiInfo() {
Contact contact = new Contact("千峰教育","","");
return new ApiInfoBuilder()
.title("千峰教育API文档")
.description("平台管理服务api")
.contact(contact)
.version("1.0.0").build();
}
}
1.3.3. 使用Swagger步骤
- 在项目pojo包中加入User实体类
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* 用户实体类
* @Author zhaojian
*/
@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;
}
在项目controller包中创建SwaggerTestController.java测试
import com.qianfeng.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;
/**
* 用户管理接口
* @Author zhaojian
*/
@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("======删除用户成功=====");
}
}
1.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 | 默认值 |