后端SwaggerSwagger-入门
cmyang1. 简介
Swagger是基于 OpenAPI 规范(OpenAPI Specification,OAS)构建的开源接口文档自动生成工具,可以让开发人员快速设计、构建、记录以及使用 Rest API。
目前由2.0版本和3.0版本,2.0版本在2017年停止维护。
Swagger 主要包含了以下三个部分:
- Swagger Editor:基于浏览器的编辑器,编写OpenAPI 规范。
- Swagger UI:将编写的 OpenAPI 规范呈现为交互式的 API 文档。
- Swagger Codegen:它可以通过为 OpenAPI规范定义的任何 API 生成服务器存根和客户端 SDK 来简化构建过程。
2. SpringFox
https://github.com/springfox/springfox
是 spring 社区维护的一个非官方项目,是一个开源的API Doc的框架,Marty Pitt编写了一个基于Spring的组件swagger-springmvc,用于将swagger集成到springmvc中来, 它的前身是swagger-springmvc,可以将我们的Controller中的方法以文档的形式展现。
SpringFox 3.0.0,支持Spring5,Webflux,支持OpenApi 3.0.3,有springboot的整合的starter,使用更便捷
3. 与springboot整合
1 2 3 4 5
| <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>3.0.0</version> </dependency>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
| package cn.aacopy.shop.common.config;
import org.springframework.context.annotation.Bean; import org.springframework.http.HttpMethod; import org.springframework.stereotype.Component; import springfox.documentation.builders.*; import springfox.documentation.oas.annotations.EnableOpenApi; import springfox.documentation.schema.ScalarType; import springfox.documentation.service.*; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket;
import java.util.ArrayList; import java.util.List;
@Component @EnableOpenApi public class SwaggerConfig {
@Bean public Docket webApiDoc() { return new Docket(DocumentationType.OAS_30) .groupName("用户端接口文档") .pathMapping("/") .enable(true) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("cn.aacopy.shop")) .paths(PathSelectors.ant("/api/**")) .build() .globalRequestParameters(globalRequestParameters()) .globalResponses(HttpMethod.GET,getGlabalResponseMessage()) .globalResponses(HttpMethod.POST,getGlabalResponseMessage()); }
@Bean public Docket adminApiDoc() { return new Docket(DocumentationType.OAS_30) .groupName("管理端接口文档") .pathMapping("/") .enable(true) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("cn.aacopy.shop")) .paths(PathSelectors.ant("/admin/**")) .build(); }
private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("cm-shop") .description("微服务接口文档") .contact(new Contact("cmyang", "https://aacopy.cn", "969312613@qq.com")) .version("v1.0") .build(); }
private List<RequestParameter> globalRequestParameters() { List<RequestParameter> parameters = new ArrayList<>(); parameters.add(new RequestParameterBuilder() .name("token") .description("登录令牌") .in(ParameterType.HEADER) .query(q -> q.model(m -> m.scalarModel(ScalarType.STRING))) .required(false) .build());
return parameters; }
private List<Response> getGlabalResponseMessage() { List<Response> list = new ArrayList<>(); list.add(new ResponseBuilder() .code("4xx") .description("请求错误,根据code和msg检查") .build()); return list; } }
|
4. 使用注解
- @Api 模块配置,用在controller类,描述API接口
1 2
| @Api(tags = "用户模块") public class UserController {}
|
- @ApiOperation 接口配置,用在方法上,描述接口方法
1 2
| @ApiOperation("保存用户信息") public ResultData save(@RequestBody UserDTO userDTO) {}
|
- @ApiParam 方法参数配置,用在入参上面,描述参数
1 2 3
| @ApiOperation("删除用户") @DeleteMapping("/delete/{id}") public ResultData delete(@ApiParam(name = "用户id", required = true) @PathVariable String id) {}
|
1 2 3 4
| @ApiIgnore @ApiOperation("删除用户") @DeleteMapping("/delete/{id}") public ResultData delete(@ApiParam(name = "用户id", required = true) @PathVariable String id) {}
|
- @ApiModel表示对类进行说明,用于参数用实体类接收,value–表示对象名,description–描述
1 2
| @ApiModel("用户对象") public class UserDTO {
|
- @ApiModelProperty用于方法,字段; 表示对model属性的说明或者数据操作更改
1 2
| @ApiModelProperty(value = "姓名", required = true) private String name;
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| @Api(tags = "用户模块") @RestController @RequestMapping("/api/v1/user") public class UserController {
@ApiOperation("保存用户") @PostMapping("/save") public ResultData save(@RequestBody UserDTO userDTO) { return ResultData.success(); }
@ApiOperation("删除用户") @DeleteMapping("/delete/{id}") public ResultData delete(@ApiParam(name = "用户id", required = true) @PathVariable String id) { return ResultData.success(); }
@ApiOperation("根据用户id查询用户") @GetMapping("/findUserById/{id}") public ResultData<UserVO> findUserById(@ApiParam(name = "用户id", required = true) @PathVariable String id) { return ResultData.success(); } }
@ApiModel("用户对象") @Data public class UserDTO { @ApiModelProperty(value = "姓名", required = true) private String name; @ApiModelProperty(value = "年龄") private Integer age; }
@ApiModel("用户对象") @Data public class UserVO { @ApiModelProperty(value = "姓名", required = true) private String name; @ApiModelProperty(value = "年龄") private Integer age; }
|
5. knife4j
5.1 简介
Knife4j是一个集Swagger2 和 OpenAPI3为一体的增强解决方案
knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名kni4j是希望她能像一把匕首一样小巧,轻量,并且功能强悍!
knife4j的前身是swagger-bootstrap-ui,为了契合微服务的架构发展,由于原来swagger-bootstrap-ui采用的是后端Java代码+前端Ui混合打包的方式,在微服务架构下显的很臃肿,因此项目正式更名为knife4j
文档地址:https://doc.xiaominfo.com/
gitee: https://gitee.com/xiaoym/knife4j
5.2 不使用增强功能,纯粹换一个swagger的前端皮肤
不使用增强功能,纯粹换一个swagger的前端皮肤,这种情况是最简单的,你项目结构下无需变更
可以直接引用swagger-bootstrap-ui的最后一个版本1.9.6或者使用knife4j-spring-ui
老版本引用
1 2 3 4 5
| <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>swagger-bootstrap-ui</artifactId> <version>1.9.6</version> </dependency>
|
新版本引用
1 2 3 4 5
| <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-ui</artifactId> <version>${lastVersion}</version> </dependency>
|
5.3 Spring Boot项目单体架构使用增强功能
在Spring Boot单体架构下,knife4j提供了starter供开发者快速使用
1 2 3 4 5
| <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-boot-starter</artifactId> <version>${knife4j.version}</version> </dependency>
|
该包会引用所有的knife4j提供的资源,包括前端Ui的jar包
5.4 Spring Cloud微服务架构
在Spring Cloud的微服务架构下,每个微服务其实并不需要引入前端的Ui资源,因此在每个微服务的Spring Boot项目下,引入knife4j提供的微服务starter
1 2 3 4 5
| <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-micro-spring-boot-starter</artifactId> <version>${knife4j.version}</version> </dependency>
|
在网关聚合文档服务下,可以再把前端的ui资源引入
1 2 3 4 5
| <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-boot-starter</artifactId> <version>${knife4j.version}</version> </dependency>
|
5.5 集成到项目里
1 2 3 4 5
| <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-ui</artifactId> <version>3.0.3</version> </dependency>
|
访问地址:http://127.0.0.1:8080/doc.html