SpringBoot 项目引入 Knife4j 接口文档

171 阅读3分钟

Swagger 接口文档

Swagger 是一个规范和完整的框架,用于生成,描述,调用和可视化 RESTFul 风格的接口文档

为什么需要接口文档

  1. 有一个书面的内容(文档),可以查询和参考,避免口口相传

  2. 接口文档支持在线调试接口,在线测试,可以不用前端页面发送请求,提高开发测试的效率

  3. 接口文档可以方便前端和后端工作的对接,是前后端联调的介质

什么是接口文档

包含接口信息的文档,每条接口有

  • 请求参数
  • 响应参数
  • 接口地址
  • 请求类型
  • 请求的格式

怎么在 springBoot 项目中引入接口文档

Knife4j 是对 swagger 接口文档的增强,所以该项目中直接引用 Knife4j

  1. 引入 maven 的相关依赖

  2. 自定义 Knife4j 的配置类

  3. 在配置类中指定要扫描的包,生成对应的接口文档

  4. maven相关依赖

<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-spring-boot-starter</artifactId>
    <version>${knife4j}</version>
</dependency>
  1. 使用 @Configuration 注入一个配置类,在配置类中指定生成的接口文档的相关信息
  • title: 是接口文档的名称
  • description: 是接口文档的描述
  • 创建 docker 对象中的 apis() 是指定扫描要生成接口信息的那个包。通常是 Controller 包
  • 其他的照抄就行了
  • 记得设置静态资源的映射 addResourceHandlers() 方法。否则无法访问接口文档
@Configuration
@Slf4j
public class WebMvcConfiguration extends WebMvcConfigurationSupport {

    /**
     * 通过knife4j生成接口文档
     * @return
     */
    @Bean
    public Docket docket01() {
        ApiInfo apiInfo = new ApiInfoBuilder()
                .title("苍穹外卖项目接口文档")
                .version("2.0")
                .description("苍穹外卖项目接口文档")
                .build();
        Docket docket = new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.sky.controller.admin"))
                .paths(PathSelectors.any())
                .build();
        return docket;
    }

 
    /**
     * 设置静态资源映射
     * @param registry
     */
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
    
}
  1. 现在就可以访问我们的接口文档了。访问的地址是 : http://ip:port/doc.html
  2. 效果图

image.png

将接口文档分组

如果现在我们有很多的接口,例如 admin , user, .... 这些接口全部都放在同一个接口文档,就显得太繁琐了,操作起来也不方便。所以我们可以对我们的接口文档进行分组。分成:

  1. 管理员相关的接口文档
  2. 用户相关的接口文档

效果图:

image.png

实现起来也非常的简单,只需要创建两个 apiInfo ,并且在创建 docker 时加多一个 groupName() 方法进行分组即可 以下是代码的实现:

@Configuration
@Slf4j
public class WebMvcConfiguration extends WebMvcConfigurationSupport {

    /**
     * 通过knife4j生成接口文档
     * @return
     */
    @Bean
    public Docket docket01() {
        ApiInfo apiInfo = new ApiInfoBuilder()
                .title("苍穹外卖项目接口文档")
                .version("2.0")
                .description("苍穹外卖项目接口文档")
                .build();
        Docket docket = new Docket(DocumentationType.SWAGGER_2)
                .groupName("管理端接口")
                .apiInfo(apiInfo)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.sky.controller.admin"))
                .paths(PathSelectors.any())
                .build();
        return docket;
    }

    @Bean
    public Docket docket02() {
        ApiInfo apiInfo = new ApiInfoBuilder()
                .title("苍穹外卖项目接口文档")
                .version("2.0")
                .description("苍穹外卖项目接口文档")
                .build();
        Docket docket = new Docket(DocumentationType.SWAGGER_2)
                .groupName("用户端接口")
                .apiInfo(apiInfo)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.sky.controller.user"))
                .paths(PathSelectors.any())
                .build();
        return docket;
    }


    /**
     * 设置静态资源映射
     * @param registry
     */
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
    }

    }
}