乐于分享
好东西不私藏

Knife4j:若依API文档用这个,界面美观功能强大

Knife4j:若依API文档用这个,界面美观功能强大

Knife4j:若依API文档用这个,界面美观功能强大

家人们,若依项目接口文档怎么管理?手写Swagger太丑?接口调试不方便?今天我给你推荐一个神器——Knife4j,保证你用完离不开。

这玩意儿能干啥?

Knife4j是Spring Boot生态中最美的API文档框架,专门解决这些问题:

  1. 1. 接口文档自动生成:写完接口,文档自动出来
  2. 2. 在线接口调试:不用Postman,直接在页面调
  3. 3. 接口版本管理:文档变更历史一清二楚
  4. 4. 权限控制:文档查看需要授权
  5. 5. 离线文档导出:PDF/Markdown格式

简单说,Knife4j = Swagger + Postman + Markdown,一个工具全搞定。

若依开发中的痛点

家人们,若依项目里这些场景用Knife4j简直绝配:

痛点
原来
用Knife4j后
接口文档
手写维护麻烦
自动生成
接口调试
复制到Postman
页面直接调
参数说明
靠注释
注解一标就显示
前后端联调
天天扯皮
文档即调式
接口变更
不知道谁改的
版本历史可查

接口调试效率提升300%,这不是吹的。

怎么用?

安装

<!-- Maven依赖 --><dependency>    <groupId>com.github.xiaoymin</groupId>    <artifactId>knife4j-openapi2-spring-boot-starter</artifactId>    <version>4.3.0</version></dependency>

若依配置

package com.ruoyi.framework.config;import io.swagger.annotations.ApiOperation;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;@Configuration@EnableSwagger2public class Knife4jConfig {    @Bean    public Docket createRestApi() {        return new Docket(DocumentationType.SWAGGER_2)                .apiInfo(apiInfo())                .select()                // 若依接口包路径                .apis(RequestHandlerSelectors.basePackage("com.ruoyi"))                // 有@ApiOperation注解的才生成文档                .apis(RequestHandlerSelectors.withMethodAnnotation(                        ApiOperation.class))                .paths(PathSelectors.any())                .build();    }    private ApiInfo apiInfo() {        return new ApiInfoBuilder()                .title("若依接口文档")                .description("RuoYi-Vue-Plus-Xiaowei API接口文档")                .contact(new Contact("小韦",                    "https://gitee.com/loveseaone",                    "xiaowei@email.com"))                .version("1.0.0")                .build();    }}

注解使用

@Api(tags = "用户管理")@RestController@RequestMapping("/system/user")public class SysUserController {    @ApiOperation("获取用户列表")    @GetMapping("/list")    public AjaxResult list(            @ApiParam("用户名")            @RequestParam(value = "userName", required = false) String userName,            @ApiParam("手机号码")            @RequestParam(value = "phonenumber", required = false) String phonenumber,            @ApiParam("状态")            @RequestParam(value = "status", required = false) String status) {        return AjaxResult.success(userService.selectUserList(new SysUser()));    }    @ApiOperation("新增用户")    @PostMapping    public AjaxResult add(            @ApiParam("用户信息")            @RequestBody SysUser user) {        return AjaxResult.success(userService.insertUser(user));    }    @ApiOperation("修改用户")    @PutMapping    public AjaxResult edit(            @ApiParam("用户信息")            @RequestBody SysUser user) {        return AjaxResult.success(userService.updateUser(user));    }    @ApiOperation("删除用户")    @DeleteMapping("/{userId}")    public AjaxResult remove(            @ApiParam("用户ID")            @PathVariable Long userId) {        return AjaxResult.success(userService.deleteUserById(userId));    }}

错误 vs 正确

❌ 错误写法:不分组,所有接口混在一起

// 一个Docket,所有接口return new Docket(DocumentationType.SWAGGER_2);

✅ 正确写法:分组展示,清晰明了

@Beanpublic Docket userApi() {    return new Docket(DocumentationType.SWAGGER_2)            .groupName("用户管理")            .select()            .apis(RequestHandlerSelectors.basePackage("com.ruoyi.system.controller"))            .build();}@Beanpublic Docket systemApi() {    return new Docket(DocumentationType.SWAGGER_2)            .groupName("系统管理")            .select()            .apis(RequestHandlerSelectors.basePackage("com.ruoyi.sys.controller"))            .build();}

应用场景

场景1:前后端联调

背景:若依项目前后端联调,接口参数经常对不上

方案:Knife4j在线调试

1. 后端写接口 → 文档自动生成2. 前端打开文档 → 查看接口定义3. 页面直接调试 → 确认返回数据4. 复制代码到前端 → 完成

效果:联调时间从2天→2小时,提升8倍

场景2:接口文档分享

背景:需要给第三方合作伙伴提供API文档

方案:Knife4j导出离线文档

# 在 Knife4j 文档页面点击"离线文档"# 选择导出格式:PDF/Markdown

效果:文档生成从1天→1分钟

场景3:接口权限控制

背景:内部接口文档不想让所有人看

方案:Knife4j + Spring Security

@Configurationpublic class SecurityConfig extends WebSecurityConfigurerAdapter {    @Override    protected void configure(HttpSecurity http) throws Exception {        http            .authorizeRequests()            .antMatchers("/swagger-ui.html", "/doc.html").authenticated()            .anyRequest().permitAll();    }}

效果:文档泄露风险降低90%

项目亮点

维度
说明
技术栈
Java + Spring Boot + Swagger
架构
微内核,插件化
文档
中文文档完善
社区
GitHub 9.8k Star,持续维护
协议
Apache 2.0,免费商用

踩坑提示

问题1:文档打不开

第一优先排查:检查是否引入正确依赖

<!-- 错误:旧版本 --><dependency>    <groupId>com.github.xiaoymin</groupId>    <artifactId>knife4j-spring-boot-starter</artifactId>    <version>3.0.2</version></dependency><!-- 正确:新版本 --><dependency>    <groupId>com.github.xiaoymin</groupId>    <artifactId>knife4j-openapi2-spring-boot-starter</artifactId>    <version>4.3.0</version></dependency>

问题2:接口没显示

第一优先排查:检查包路径是否正确

// 必须是你的Controller所在包.apis(RequestHandlerSelectors.basePackage("com.ruoyi"))

问题3:参数注解不生效

第一优先排查:是否添加了swagger注解

// 必须添加的注解@ApiOperation("接口说明")@GetMapping("/test")public void test(@ApiParam("参数说明") String param) {}

总结

Knife4j真的香

  • • 界面美观,比Swagger原生界面好看10倍
  • • 功能强大,文档+调试+导出全搞定
  • • 集成简单,Spring Boot零配置
  • • 持续维护,版本迭代快

家人们,若依项目用Knife4j,接口文档不再烦。赶紧用起来!

GitHub:https://github.com/xiaoymin/knife4j文档:https://doc.xiaoymin.cn