Swagger+knife4j 易于整合SpringBoot的OpenAPI文档生成利器

2022-01-07 17:25:23 浏览数 (1)

1.Swagger简介

前端和后端的联调离不开API文档,而手动编写API文档是一项耗时又费力的操作。Swagger正是基于简化API文档的输出的一个优秀的开源框架,通过OpenAPI的规范呈现接口信息,方便的提供测试和联调。这样,如果按照新的开发模式,在开发新版本或者迭代版本的时候,只需要更新Swagger描述文件,就可以自动生成接口文档和客户端服务端代码,做到调用端代码、服务端代码以及接口文档的一致性。

官方地址:

代码语言:javascript复制
https://swagger.io
2.Springboot集成Swagger2及常见配置
第一步:添加依赖
代码语言:javascript复制
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.9.2</version>
</dependency>

2.9.2的版本是用的最多的,具体的可以直接去maven的官网去搜索,找一个使用量最多的版本即可。

第二步:配置

新建config包,创建SwaggerConfig类

代码语言:javascript复制
@EnableSwagger2
@Configuration
public class Swagger2Config {
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
             .apiInfo(apiInfo())
             .select()
             //为当前包路径,控制器类包
             .apis(RequestHandlerSelectors.basePackage("com.fdd.controller"))
            .paths(PathSelectors.any())
             .build();
    }
    //构建 api文档的详细信息函数
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
            //页面标题
           .title("XX平台API接口文档")
            //创建人
           .contact(new Contact("test", "http://www.test.cc",  
                                "XXX@qq.com"))
           //版本号
          .version("1.0")
           //描述
          .description("系统API描述")
          .build();
    }

这里的配置也比较简单。这里有很多选项供我们去配置。如果我们的项目有多个组,只需要创建多个Docket即可。这时候扫描的包换成每个组的包路径。

第三步:controller类中配置

新建一个controller包,然后创建HelloController类

代码语言:javascript复制
@Api("Hello控制类")
@RestController 
public class HelloController {
    @GetMapping(value = "/user")
    public User getUser(){
        return new User("愚公要移山","123456");
    }
    @ApiOperation("可以指定参数的API")
    @PostMapping("/param")
    public String hello2(@ApiParam("用户名") String name){
        return "hello"   name;
    }
}

这里我们可以看出,使用注解就可以对这个类、方法、字段等等进行解释说明。其他的字段还有很多,在使用的时候会有相应的提示,可以自己试一遍:

3.常用注解

@Api 标识一个java类型是文档类,用controller类的类名上

@ApiModel 表示一个实体类/模型文档,用在类名上;

@ApiModelProperty 作用在属性上,添加属性描述;

@ApiOperation 作用在接口类的方法上,控制方法的相关描述;

@ApiImplicitParam 作用在接口方法上,描述单个参数信息,只能作用在方法上;

@ApiImplicitParams 作用在接口方法上,@ApiImplicitParam参数组;

@ApiParam 作用在接口方法上,描述单个参数信息,属性基本与@ApiImplicitParam一样,但可以作用在方法、参数、属性上;

下面分别对每个注解的常用参数作讲解。

@Api:

value:字符串,对controller类的作用描述,代替原来的description(已过时),一般用此属性;

tags:字符串数组,标签组,同样可以描述controller的作用;

@ApiModel

value:字符串,模型的简短别名,使得在文档的导航中便于识别;

description:字符串,模型的附加描述;

@ApiOperation

value:字符串,方法的功能描述;

tags:字符串数组,标签组,同样可以描述方法的作用;

response:ClassType,显示指出返回的对象类型;在响应示例中会显示出改对象的字段以及示例、描述;

code:响应代码,默认200,一般不改;

@ApiModelProperty

value:字符串,字段描述;

required:boolean;指定参数是否必须,默认false;

example:字符串,参数值的示例

@ApiImplicitParam

name:字符串,参数名;

value:字符串,参数描述;

defaultValue:字符串,参数默认值;

required:boolean,标识是否必须传值,默认false;

dataType:字符串,参数类型,可以是某个类名,也可以是基本数据类型的引用类名,如Integer;

example:字符串,参数值示例;

@ApiImplicitParams

value:@ApiImplicitParam类型数组,当方法有多个@ApiImplicitParam参数时,需要放到@ApiImplicitParams注解中

@ApiParam

name:字符串,参数名;

value:字符串,参数描述;

defaultValue:字符串,设置默认值;

required:boolean,是否必须,默认false;

example:字符串,参数值示例;

4.替换swagger-ui,选择款神器—knife4j

首先我们来看下界面功能的对比,swagger-ui界面如下:

访问地址:

代码语言:javascript复制
http://localhost:8080/swagger-ui

knife4j界面如下:

访问地址:

代码语言:javascript复制
http://localhost:8080/doc.html

从以上可以看出knife4j界面相比swagger-ui界面更加美观,功能更加全面,除了测试相关功能外,还提供了相应的文档管理,很方便的输出不同格式的API文档,极大的方便了接口文档的输出。

5.knife4j的使用

Knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名kni4j是希望她能像一把匕首一样小巧,轻量,并且功能强悍!

Knife4j的前身是swagger-bootstrap-ui,为了契合微服务的架构发展,由于原来swagger-bootstrap-ui采用的是后端Java代码 前端Ui混合打包的方式,在微服务架构下显的很臃肿,因此项目正式更名为knife4j

更名后主要专注的方面

  • 前后端Java代码以及前端Ui模块进行分离,在微服务架构下使用更加灵活
  • 提供专注于Swagger的增强解决方案,不同于只是改善增强前端Ui部分
5.1 项目模块

目前主要的模块包括:

模块名称

说明

knife4j

为Java MVC框架集成Swagger的增强解决方案

knife4j-admin

云端Swagger接口文档注册管理中心,集成gateway网关对任意微服务文档进行组合集成

knife4j-extension

chrome浏览器的增强swagger接口文档ui,快速渲染swagger资源

knife4j-service

为swagger服务的一系列接口服务程序

knife4j-front

knife4j-spring-ui的纯前端静态版本,用于集成非Java语言使用

swagger-bootstrap-ui

knife4j的前身,最后发布版本是1.9.6

5.2 业务场景

不使用增强功能,纯粹换一个swagger的前端皮肤

不使用增强功能,纯粹换一个swagger的前端皮肤,这种情况是最简单的,你项目结构下无需变更

可以直接引用swagger-bootstrap-ui的最后一个版本1.9.6或者使用knife4j-spring-ui

老版本引用

代码语言:javascript复制
<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>swagger-bootstrap-ui</artifactId>
    <version>1.9.6</version>
</dependency>

新版本引用

代码语言:javascript复制
<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-spring-ui</artifactId>
    <version>${lastVersion}</version>
</dependency>
5.3 Spring Boot项目单体架构使用增强功能

在Spring Boot单体架构下,knife4j提供了starter供开发者快速使用

代码语言:javascript复制
<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

代码语言:javascript复制
<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-micro-spring-boot-starter</artifactId>
    <version>${knife4j.version}</version>
</dependency>

在网关聚合文档服务下,可以再把前端的ui资源引入

代码语言:javascript复制
<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-spring-boot-starter</artifactId>
    <version>${knife4j.version}</version>
</dependency>
5.5 另外说明

不管是knife4j还是swagger-bootstrap-ui

对外提供的地址依然是doc.html

代码语言:javascript复制
访问:http://ip:port/doc.html

0 人点赞