苍穹外卖之Swagger+Knife4j在项目中的应用场景

Swagger+Knife4j

参考视频或文章

一、技术介绍

1.OpenAPI规范

OpenAPI规范(旧称Swagger规范),是一种与语言无关的标准,用于描述RESTful API。它使用yaml或json格式定义API的端点、操作、参数、请求/响应格式和认证方法。

2.Swagger

2.1 概述
  • Swagger是由SmartBear Software提供一套用于设计、构建、文档化和测试RSETful API的开源工具集,核心是OpenAPI规范。
  • Swagger提供了一种标准化的方式来描述API的结构、请求参数和响应格式等信息,使得前后端开发人员能够更高效地协作。
  • Swagger最初是独立的API规范,现在已经成为OpenAPI Specification的基础。
2.2 Swagger的三大核心组件
  • Swagger UI:一个可视化工具,可以将OpenAPI规范呈现为交互式API文档,它允许程序员直接在浏览器中查看和测试API。
  • Swagger Editor:一个基于浏览器的在线编辑器,用于编写OpenAPI规范,能够实时预览和验证功能。
  • Swagger Codegen:一个代码生成工具,可以根据OpenAPI规范API自动生成服务端存根和客户端SDK。
2.3 Swagger的优势
  • 标准化的API文档:Swagger提供了一种统一格式如OpenAPI规范来描述API,避免了文档不一致的问题。
  • 提高开发效率:前后端开发人员可以并行工作,前端开发无需等待后端API完成即可动手开发。
  • 自动化测试:通过Swagger UI,程序员可以直接在浏览器中测试API,无需额外工具。
  • 代码自动生成:Swagger Codegen可以自动生成客户端SDK,减少手动编写代码的工作量。

3.Knife4j

3.1 概述
  • Knife4j是一个用于生成、展示和增强API接口文档的国产开源工具,主要应用于Java后端项目。
  • Knife4j基于OpenAPI规范,并在Swagger原有能力的基础上,提供了更美观的UI、更强的功能和更好的使用体验。
3.2 主要功能
  • 自动生成接口文档 :根据Controller接口和Swagger注解,自动解析接口路径、请求方式(GET、POST等)、请求参数和返回结果,避免手写接口文档,实现"代码即文档"。
  • 更美观的UI:相比原生Swagger UI,页面布局更清晰,支持接口搜索和接口分组。
  • 在线接口调试:可以直接在文档页面填写参数,一键发送请求,实时查看返回结果。
  • 微服务文档聚合:适合多模块的后端项目。
  • 导出离线文档:可以将接口文档导出为Markdown、HTML等多种格式,便于撰写技术文档。
3.3 对比
功能 Swagger Knife4j
接口文档生成 手动 自动
UI 基础 更美观
在线调试 基础 更强
接口分组 有限 支持
文档导出 ×
微服务聚合 ×

二、项目应用

涉及到的文件如下:

yml 复制代码
sky-take-out: pom.xml

sky-server:
	pom.xml
	config: WebMvcConfig

1.导入Knife4jMaven依赖坐标

1.1 sky-take-out: pom.xml
xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>spring-boot-starter-parent</artifactId>
        <groupId>org.springframework.boot</groupId>
        <version>2.7.3</version>
    </parent>
    
    <groupId>com.sky</groupId>
    <artifactId>sky-take-out</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    
    <modules>
        <module>sky-common</module>
        <module>sky-pojo</module>
        <module>sky-server</module>
    </modules>
    
    <properties>
        <knife4j>3.0.2</knife4j>
    </properties>
    
    <dependencyManagement>
        <dependencies>
			<dependency>
                <groupId>com.github.xiaoymin</groupId>
                <artifactId>knife4j-spring-boot-starter</artifactId>
                <version>${knife4j}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>
1.2 sky-server: pom.xml
xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>sky-take-out</artifactId>
        <groupId>com.sky</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>sky-server</artifactId>
    <dependencies>
        <dependency>
            <groupId>com.sky</groupId>
            <artifactId>sky-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.sky</groupId>
            <artifactId>sky-pojo</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <scope>compile</scope>
        </dependency>
    
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-spring-boot-starter</artifactId>
        </dependency> 
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2.在WebMvcConfig中编写Knife4j生成接口文档的相关配置

java 复制代码
/**
 * 配置类,注册web层相关组件
 */
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {

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

    //Logic: 注册Swagger文档生成器Docket,通过Knife4j生成接口文档
    // 管理端接口
    @Bean("adminDocket")// 手动指定Bean名称,防止冲突
    public Docket adminDocket() {
        log.info("准备生成管理端接口文档...");
        ApiInfo apiInfo = new ApiInfoBuilder()
                .title("苍穹外卖项目接口文档")
                .version("1.0")
                .description("苍穹外卖项目接口文档")
                .build();
        Docket adminDocket = new Docket(DocumentationType.SWAGGER_2)
                .groupName("管理端接口")
                .apiInfo(apiInfo)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.sky.controller.admin"))// 扫描管理端接口所在的包
                .paths(PathSelectors.any())
                .build();
        return adminDocket;
    }

    // 用户端接口
    @Bean("userDocket")
    public Docket userDocket() {
        log.info("准备生成用户端接口文档...");
        ApiInfo apiInfo = new ApiInfoBuilder()
                .title("苍穹外卖项目接口文档")
                .version("1.0")
                .description("苍穹外卖项目接口文档")
                .build();
        Docket userDocket = new Docket(DocumentationType.SWAGGER_2)
                .groupName("用户端接口")
                .apiInfo(apiInfo)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.sky.controller.user"))// 扫描用户端接口所在的包
                .paths(PathSelectors.any())
                .build();
        return userDocket;
    }
}

3.启动项目后查看生成的接口文档

访问http://localhost:8080/doc.html,即可跳转到接口文档。

相关推荐
WorldWelcome2 天前
springboot3整合knife4j,并nginx映射到外网
nginx·springboot3·knife4j·jdk21
海边的Kurisu5 天前
苍穹外卖日记 | Day4 套餐模块
java·苍穹外卖
Zsh-cs13 天前
苍穹外卖day6微信登录报错500且openid=null(已解决)
苍穹外卖·微信登录
多则惑少则明1 个月前
SpringBoot3整合knife4j(swagger3)
java·spring boot·swagger
秋雨雁南飞1 个月前
C# SignalR 添加Swagger
c#·swagger·signalr
召田最帅boy1 个月前
Swagger使用教程
swagger
闲人编程2 个月前
OpenAPI/Swagger规范与API文档自动化
运维·自动化·json·swagger·schema·openapi·codecapsule
一念一花一世界2 个月前
接口管理工具选型:Swagger与PostIn全面对比指南
测试工具·postman·swagger·postin·接口管理工具
一念一花一世界2 个月前
接口管理工具选型:Postman、Swagger与PostIn的全面对比指南
测试工具·postman·swagger·接口管理工具