⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 blog.csdn.net/wuzhiwei549/article/details/105890151 「夏目 "」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

介绍

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

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

目前项目主要的模块如下:

此示例根据官方文档介绍演示。

开源仓库

Github

  • https://github.com/xiaoymin/swagger-bootstrap-ui

码云

  • https://gitee.com/xiaoym/knife4j

核心功能

该UI增强包主要包括两大核心功能:文档说明 和 在线调试

文档说明:根据Swagger的规范说明,详细列出接口文档的说明,包括接口地址、类型、请求示例、请求参数、响应示例、响应参数、响应码等信息,使用swagger-bootstrap-ui能根据该文档说明,对该接口的使用情况一目了然。

在线调试:提供在线接口联调的强大功能,自动解析当前接口参数,同时包含表单验证,调用参数可返回接口响应内容、headers、Curl请求命令实例、响应时间、响应状态码等信息,帮助开发者在线调试,而不必通过其他测试工具测试接口是否正确,简介、强大。

UI增强

同时,swagger-bootstrap-ui在满足以上功能的同时,还提供了文档的增强功能,这些功能是官方swagger-ui所没有的,每一个增强的功能都是贴合实际,考虑到开发者的实际开发需要,是比不可少的功能,主要包括:

  • 个性化配置:通过个性化ui配置项,可自定义UI的相关显示信息
  • 离线文档:根据标准规范,生成的在线markdown离线文档,开发者可以进行拷贝生成markdown接口文档,通过其他第三方markdown转换工具转换成html或pdf,这样也可以放弃swagger2markdown组件
  • 接口排序:自1.8.5后,ui支持了接口排序功能,例如一个注册功能主要包含了多个步骤,可以根据swagger-bootstrap-ui提供的接口排序规则实现接口的排序,step化接口操作,方便其他开发者进行接口对接

快速开始

相信使用过springboot的人大都知道和用过swagger,knife4j的使用方法和swagger几乎一模一样,没有什么学习成本,不同的是展示的接口UI文档更加友好和人性化。下面开始演示一个集成项目,首先来看pom文件依赖:

<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>1.9.6</version>
</dependency>

只引入一个knife4j的starter即可,不用其它依赖。springboot的配置文件和启动类不用做任何特殊配置,使用knife4j需要一个swagger的配置类,这个配置类和以前使用swagger几乎是一样的:

@Configuration
@EnableSwagger2
@EnableSwaggerBootstrapUi
public class Swagger2Config {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.useDefaultResponseMessages(false)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("spring.boot.knife4j.controller"))
.paths(PathSelectors.any())
.build();

}

private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("项目接口文档")
.description("服务相关接口")
.contact(new Contact("vincent",null,"vincent549@vip.qq.com"))
.version("1.0")
.build();
}

}

可以看到,内容上没什么变化,唯一的变化是类注解需要比原来的swagger多加一个 @EnableSwaggerBootstrapUi。这样knife4j的所有配置都完成了,启动项目可以访问地址:

http://localhost:8080/doc.html?plus=1

来看一下效果:

接口配置

下面来配置一个简单的接口,查看文档的展示效果。

首先来看接口的通用返回结果:

@ApiModel("通用接口返回对象")
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Results<T> {

@ApiModelProperty(required = true,notes = "结果码",example = "200")
private int state;
@ApiModelProperty(required = true,notes = "时间戳",example = "1567425139000")
private long time;
@ApiModelProperty(required = true,notes = "返回信息",example = "SUCCESS")
private String message;
@ApiModelProperty(required = true,notes = "返回数据",example = "{\"name\":\"blues\"}")
private T content;

}
@ApiModel("用户对象")
@AllArgsConstructor
@NoArgsConstructor
@Data
public class UserVO {

@ApiModelProperty(required = true,notes = "用户名",example = "blues")
private String name;

@ApiModelProperty(required = true,notes = "用户返回消息",example = "hello world")
private String words;


}

通过上面两个的定义,接口的返回类型就搞定了,下面来看接口:

@Api(tags = "HELLO CONTROLLER 测试功能接口")
@RestController
public class HelloController {


@ApiImplicitParams({
@ApiImplicitParam(name = "name",value = "用户名称",required = true,dataType = "String",paramType = "path",example = "blues")
})
@ApiResponses(value = {
@ApiResponse(code = 200, message = "接口返回成功状态"),
@ApiResponse(code = 500, message = "接口返回未知错误,请联系开发人员调试")
})
@ApiOperation(value = "Hello 测试接口", notes = "访问此接口,返回hello语句,测试接口")
@GetMapping("hello/{name}")
public Results<UserVO> hello(@PathVariable String name){
UserVO userVO = new UserVO(name,"hello " + name);
Results<UserVO> results = new Results<>(200,"SUCCESS", userVO);
return results;
}

}

这个接口类中分为几个部分需要注意,第一是类上面的@Api注解,描述了整个类的接口分类含义。还有一个是每个接口上面的 @ApiImplicitParams 注解,定义了接口的所有参数。还有@ApiResponses注解,定义了返回时,所有状态码所代表的的含义,最后是@ApiOperation注解,描述了单个接口本身的功能。

定义接口完成后,我们来重启项目,查看文档的效果:

首页上面有一些变化,左侧列表多了HelloController类的整体描述栏目,我们点开这个栏目,可以看到类中定义的所有接口:

点击这个接口,看到右侧非常详细的接口文档:

上图中展示的是接口地址,接口类型,接口描述和详细的入参描述,下面的相应状态展示了我们定义的两种状态类型,还有接口的回参也非常详细的列了出来:

文字描述类型,数据结构,类型都有,还有响应示例,可以说非常清晰了。个人认为这种展示效果比原来的swagger要友好很多。

右侧还有调试功能,可以直接使用来测试接口:

在左侧的文档管理中,还可以设置全局参数,支持类似jwt的带权限的测试:

对文档还可以进行个性化设置:

说明

上面简单介绍和演示了knife4j,这个starter不仅支持swagger-bootstrap-ui,原始的swagger-ui还是可以使用的:

有些更加喜欢原始风格的同学可以看这个页面。另外,swagger有很多注解,可以使文档展示的信息更加完善和友好,大家可以自行尝试和学习。

文章目录
  1. 1. 介绍
  2. 2. 开源仓库
  3. 3. 核心功能
  4. 4. UI增强
  5. 5. 快速开始
  6. 6. 接口配置
  7. 7. 说明