Appearance
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显示等,请参考
1. 什么是Swagger
企业实际开发中问题如下:
- 无论是前端还是后端开发,都或多或少地被接口文档折磨过。
- 前端经常抱怨后端给的接口文档与实际情况不一致。
- 后端又觉得编写及维护接口文档会耗费精力,经常来不及更新。
- 无论是前端调用后端,还是后端调用后端,都期望有一个好的接口文档。
- 程序员经常会抱怨别人写的代码没有写接口文档.
- 自己写起代码起来,最讨厌的,就是写接口文档。
如何解决上面所述问题? 可以使用Swagger技术自动生成接口文档!!!
2. 简介
Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务(https://swagger.io/)。 它的主要作用是:
使得前后端分离开发更加方便,有利于团队协作
接口的文档在线自动生成,降低后端开发人员编写接口文档的负担
功能测试
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