• API文档工具knife4j使用详解


    api文档

    编写api文档是一个费时的操作,过程枯燥。那有没有一种可以自动生成api文档的工具呢,答案是有,比如swagger就是可以自动生成的,像yapi、apidoc、showdoc等等是需要我们编辑的,这样较为复杂且容易遗漏。但是他们的界面很好看,那有没有一种好看的的api文档工具呢,答案也是有,swagger文档增强工具knife4j,界面和功能比swagger更好看,但是是基于swagger开发的。

    基本使用

    1、引入依赖包

    想要使用knife4j非常简单,只要在Springboot项目中引入knife4j的依赖即可

    1. <dependency>
    2. <groupId>com.github.xiaoymin</groupId>
    3. <artifactId>knife4j-spring-boot-starter</artifactId>
    4. <version>2.0.9</version>
    5. </dependency>

    注意点:引入了knife4j之后会自动引入一个swagger包,且需要注意springboot版本与swagger版本的匹配,否则启动会出现失败,例如此类的错误Failed to start bean ‘documentationPluginsBootstrapper ‘ ; nested exception…  主要原因是Springboot2.6.x高版本与Swagger2版本冲突问题。

    会自动给我们引入swagger,因此我们无需单独引入swagger包,否则会引起版本冲突,在使用knife4j的一些增强功能时会报错

    2、单应用使用

    1、首先创建一个springboot环境,并且像上方一样引入依赖坐标。

    2、创建swagger配置类,注入到springboot容器

    1. @Configuration
    2. @EnableSwagger2WebMvc
    3. public class SwaggerConfig {
    4. // 创建Docket存入容器,Docket代表一个接口文档
    5. @Bean
    6. public Docket webApiConfig() {
    7. return new Docket(DocumentationType.SWAGGER_2)
    8. // 创建接口文档的具体信息
    9. .apiInfo(webApiInfo())
    10. // 创建选择器,控制哪些接口被加入文档
    11. .select()
    12. // 指定@ApiOperation标注的接口被加入文档
    13. .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
    14. .build();
    15. }
    16. // 创建接口文档的具体信息,会显示在接口文档页面中
    17. private ApiInfo webApiInfo() {
    18. return new ApiInfoBuilder()
    19. // 文档标题
    20. .title("派派洪后台接口管理")
    21. // 文档描述
    22. .description("后台接口文档")
    23. // 版本
    24. .version("1.0")
    25. // 联系人信息
    26. .contact(new Contact("南山北派", "http://baidu.com", "baidu@qq.com"))
    27. // 版权
    28. .license("南山北派")
    29. // 版权地址
    30. .licenseUrl("http://www.baidu.com")
    31. .build();
    32. }
    33. }

    3、创建一个controller,用swagger相关注解来描述生成api文档

    1. @RestController
    2. @RequestMapping("user")
    3. @Api(tags = "用户管理")
    4. @ApiSupport(author = "南山北派")
    5. public class UserController {
    6. HashMap<String, String> userMap = new HashMap<String, String>() {
    7. {
    8. put("zhangsan", "张三");
    9. put("lisi", "李四");
    10. put("wangmazi", "王麻子");
    11. put("redmi", "红米");
    12. put("huawei", "华为");
    13. }
    14. };
    15. @GetMapping("getName/{userName}")
    16. @ApiOperation("查找用户名的真实姓名")
    17. @ApiOperationSupport(author = "派派洪")
    18. public String getName(@PathVariable("userName") @ApiParam("用户名") String userName) {
    19. if (userMap.containsKey(userName)) {
    20. return userMap.get(userName);
    21. }
    22. return "账号不存在";
    23. }
    24. }

    4、启动项目可以访问ip:端口/doc.html即可看到knife4j的文档界面

    3、增强功能

    使用knife4j增强功能的前提是要在yaml配置中开启增强模式

    1. knife4j:
    2. enable: true

    1.添加接口作者

    swagger只能给整个文档添加作者,不能针对某个接口单独添加作者。knife4j中可以有2种方式给接口添加作者:

    1. 在Controller类上标注@ApiSupport(author = 作者名称),这样整个Controller中的所有接口方法将被指定为该作者
    2. 在Controller接口方法上标注@ApiOperationSupport(author = 作者名称),这样该接口被指定为该作者
    3. 如果@ApiSupport和@ApiOperationSupport同时指定了作者,那么方法级别的@ApiOperationSupport优先级更高

    2.生产环境关闭文档

    目前Springfox-Swagger以及Knife4j提供的资源接口包括如下:

    资源

    说明

    /doc.html

    Knife4j提供的文档访问地址

    /v2/api-docs-ext

    Knife4j提供的增强接口地址,自

    2.0.6版本后删除

    /swagger-resources

    Springfox-Swagger提供的分组接口

    /v2/api-docs

    Springfox-Swagger提供的分组实例详情接口

    /swagger-ui.html

    Springfox-Swagger提供的文档访问地址

    /swagger-resources/configuration/ui

    Springfox-Swagger提供

    /swagger-resources/configuration/security

    Springfox-Swagger提供

    swagger中要实现生产环境关闭文档资源需要在配置类中进行编码,判断环境,比较麻烦。knife4j中只需要在对应环境的配置中添加配置即可

    1. spring:
    2. profiles: prod # 指定为生产环境
    3. knife4j:
    4. production: true # 开启屏蔽文档资源

    注意:如果正常非生产环境下不屏蔽文档,那么引入了springsecurtiy或者自定义拦截器的时候,要排除掉上述表格中的文档资源,否则在非屏蔽状态下也将无法访问到文档资源

    3.接口排序

    接口排序的方式有2种:

    • 针对不同Controller排序:Controller上标注@ApiSupport(order = 序号)
    • 针对同一个Controller中的不同方法排序:同一个Controller不同接口方法上标注@ApiOperationSupport(order = 序号)

    4.导出离线文档

    • markdown:导出当前逻辑分组下所有接口的Markdown格式的文档
    • Html:导出当前逻辑分组下所有接口的Html格式的文档
    • Word:导出当前逻辑分组下所有接口的Word格式的文档(自2.0.5版本开始)
    • OpenAPI:导出当前逻辑分组下的原始OpenAPI的规范json结构(自2.0.6版本开始)
    • PDF:未实现

    5.过滤请求参数

    通常我们在开发接口时,比如一个新增接口和一个修改接口,修改接口需要传递主键id、而新增接口则不需要传递此属性,但大部分情况,我们只写一个Model类,此时在新增接口时显示主键id会显得很多余。使用自定义增强注解@ApiOperationSupport中的ignoreParameters属性,可以强制忽略要显示的参数

    5.1 忽略表单参数

    我们给User实体新增一个id属性

    1. @Data
    2. @ApiModel("用户实体")
    3. public class User {
    4. @ApiModelProperty
    5. private Integer id;
    6. @ApiModelProperty("用户名")
    7. private String userName;
    8. @ApiModelProperty("姓名")
    9. private String name;
    10. }

    然后新增一个新增用户的接口方法,用表单方式接收参数,但是忽略掉id。在@ApiOperationSupport中的ignoreParameters属性中填写忽略的属性名称即可

    1. @PostMapping("/addUser")
    2. @ApiOperation("添加一个用户")
    3. @ApiOperationSupport(author = "南山北派", ignoreParameters = "id")
    4. public String addUser(User user){
    5. if (userMap.containsKey(user.getUserName())) {
    6. return "用户已经存在";
    7. }
    8. userMap.put(user.getUserName(), user.getName());
    9. return "添加成功:"+ user.getUserName();
    10. }

    注意:

    ignoreParameters支持以数组形式添加多个忽略参数

    ignoreParameters支持忽略级联对象的参数,比如User实体类中有个Address类型的属性addr,那么如果想要忽略Address的属性id,那么只需要配置为ignoreParameters = addr.id即可

    如果要忽略的参数过多,可以使用includeParameters反向配置

    5.2 忽略json参数

    如果是以@RequestBody形式接收参数,那么ignoreParameters中填写参数名.要忽略的属性名即可

    1. @PostMapping("/addUser2")
    2. @ApiOperation("添加一个用户")
    3. @ApiOperationSupport(author = "南山北派", ignoreParameters = "user.id")
    4. public String addUser2(@RequestBody User user){
    5. if (userMap.containsKey(user.getUserName())) {
    6. return "用户已经存在";
    7. }
    8. userMap.put(user.getUserName(), user.getName());
    9. return "添加成功:"+ user.getUserName();
    10. }

    注意:

    ignoreParameters支持以数组形式添加多个忽略参数

    ignoreParameters支持忽略级联对象的参数,比如User实体类中有个Address类型的属性addr,那么如果想要忽略Address的属性id,那么只需要配置为ignoreParameters = user.addr.id即可

    如果要忽略的参数过多,可以使用includeParameters反向配置

    6.AfterScript

    AfterScript功能是Knife4j自2.0.6版本开始新增的一项特性功能,在每个接口进行调试Tab中,开发者可以根据Knife4j提供的全局变量,在接口调用之前编写一段JavaScript脚本,当接口调用成功后,Knife4j会执行该脚本

    主要应用场景:针对JWT类型的接口,调用登录接口后,每个接口请求时带上Token参数,此时可以通过该脚本动态赋值全局token参数,省去复制粘贴的麻烦

    • Knife4j目前主要提供ke(Knife4j Environment)对象来获取或者操作全局对象,主要包含的对象:
      • global:全局操作,可以获取或者设置目前的全局参数
      • setHeader(name,value):设置当前逻辑分组下的全局参数Header请求头
      • setAllHeader(name,value):设置所有逻辑分组下的全局参数Header请求头
      • setParameter(name,value):设置当前逻辑分组下,主要是针对query类型参数进行设置全局设置。
      • setAllParameter(name,value):设置所有逻辑分组下的全局参数,主要是query类型
    • response:当前请求接口响应内容
    • headers:服务端响应Header对象,注意,此处所有的header的名称全部进行小写转换
    • data:服务端响应数据(json/xml/text等等)

    我们新增一个登录接口,返回token参数

    1. @PostMapping("login")
    2. @ApiOperation("登录")
    3. public HashMap<String, Object> login() {
    4. HashMap<String, Object> result = new HashMap<>(2);
    5. result.put("success", true);
    6. result.put("token", "123456");
    7. return result;
    8. }

    然后在knife4j文档中针对这个登录接口编写AfterScript,取出返回的token,设置到每一个请求的请求头中

    1. var success=ke.response.data.success;
    2. if(success===true){
    3. // 获取token
    4. var token=ke.response.data.token;
    5. // 设置当前逻辑分组下的全局Header
    6. ke.global.setHeader("Authorization", "Bearer " + token);
    7. }

    这样的效果是,请求login接口成功返回token后,后续调试其他所有接口时会自动给请求头中添加token参数,无需手动添加

    7.全局参数

    Knife4j提供基于UI临时设置全局参数功能,例如后台全局token参数等.提供该功能主要是方便开发者进行调试

    目前全局参数功能主要提供两种参数类型:query(表单)、header(请求头)

    如果后端Swagger有配置全局参数,该功能可以无视

  • 相关阅读:
    C++:中的继承关系:单继承,多继承,菱形继承的详细介绍
    GD32 RT-Thread PWM驱动函数
    MySQL高级:函数(二)自定义函数
    C/C++教程 从入门到精通《第十四章》——MFC控件详解
    增强现实(AR)开发框架
    java 批量下载将多个文件(minio中存储)压缩成一个zip包
    Java笔试题总结
    MyBatis-Plus找不到Mapper.xml文件的解决方法
    C语言超好看的爱心代码!一定不要错过!
    医疗产品设计情况下要注意哪些标准?
  • 原文地址:https://blog.csdn.net/weixin_36723038/article/details/125533232