一篇学会Swagger2(集成knife4j)

2023-11-13

目录

一、Swagger2简介

1、前言

2、Open API是什么

3、Swagger简介

3.1、特性

3.2、组件

二、knife4j

三、内容

3.1、依赖

3.2、配置类

3.3、Controller层添加注解

3.4、测试


swagger是专门开发文档的,API文档(接口文档),方便前后端工程师信息交互

knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案。

一、Swagger2简介

1、前言

接口文档对于前后端开发人员都十分重要,
尤其近几年流行前后端分离接口文档又变成重中之重,
接口文档固然重要,但是由于项目周期等原因,
后端人员经常出现无法及时更新,导致前端人员抱怨接口文档和实际情况不一致

很多人员会抱怨别人写的接口文档不规范不及时更新,
但是当自己写的时候确实最烦去写这个文档,
这种痛苦只有亲身经历才会牢记于心,
如果接口文档可以实时动态生成,就不会出现上面问题

Swagger可以完美解决上面的问题

2、Open API是什么

Open API规范以前叫Swagger规范,是REST API 的API描述格式

Open API文件允许描述整个API,包括:

  • 每个访问地址的类型。POST(写->post增,put改,delete删)或GET(读)。
  • 每个操作的参数。包括输入输出参数
  • 认证方法。
  • 连接信息,声明,使用团队和其他信息。

Open API 规范可以使用YAML(树状)或JSON格式进行编写。这样更利于我们和机械进行阅读

 Open API规范(OAS)为RUST API定义了一个与语言无关的标准接口,允许人和计算机发现和理解服务的功能,而无需访问源代码,文档或通过网络流量检查。正确定义后,消费者可以使用最少的实现逻辑来理解远程服务并与之交互。

然后,文档生成工具可以使用Open API来定义显示API,使用各种编程语言生成服务器和客户端的代码生成工具,测试工具以及其他用例。

3、Swagger简介

Swagger是一套围绕open的开源工具,可以帮助设计,构建,记录和使用REST API。

Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。

3.1、特性

1、及时性 (接口变更后,能够及时准确地通知相关前后端开发人员)

2、规范性 (并且保证接口的规范性,如接口的地址,请求方式,参数及响应格式和错误信息)

3、一致性 (接口信息一致,不会出现因开发人员拿到的文档版本不一致,而出现分歧)

4、可测性 (直接在接口文档上进行测试,以方便理解业务)

3.2、组件

Swagger Editor:基于浏览器编辑器,可以在里面边写OpenAPI规范,类似Markdown具有实时预览描述文件的功能。(偶然会在配置中出现,通过配置的方式可以实现定制化的文档显示,用的比较少,因为还要程序员自己写)

Swagger UI:将Open API规范呈现为交互式API文档。用可视化UI展示描述文件。(主要用于读,常见,可以将代码中嵌入的Swagger读出来也就是注解)

Swagger Codegen:将Open API规范生成为服务器存根和客户端库。通过Swagger Codegen可以将描述文件生成html格式和cwiki形式的接口文档,同时也可以生成多种言语的客户端和服务端代码。

Swagger Inspector:和Swagger UI有点类似,但是可以返回更多信息,也会保存请求的实际参数数据。(类似ui加了过程记录)

Swagger Hub:集成了上面所有项目的各个功能,你可以以项目和版本为单位,将你的描述文件上传到Swagger Hub中。在Swagger中可以完成上面项目的所有工作,需要注册账号,分免费版和收费版。

使用Swagger,就是把相关的信息存储在它定义的描述文件里面(yml或json格式),再通过维护这个描述文件可以去更新接口文档,以及生成各端代码。

二、knife4j

文档地址:Knife4j · 集Swagger2及OpenAPI3为一体的增强解决方案. | Knife4j

knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案。

knife4j属于service模块公共资源,因此我们集成到service-uitl模块

三、内容

3.1、依赖

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

3.2、配置类

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;

import java.util.ArrayList;
import java.util.List;

/**
 * @author 
 * @Description swagger2配置类
 * @date
 */
@Configuration
@EnableSwagger2WebMvc
public class Knife4jConfig {

    @Bean
    public Docket adminApiConfig(){
        List<Parameter> pars = new ArrayList<>();
        ParameterBuilder tokenPar = new ParameterBuilder();
        tokenPar.name("token")
                .description("用户token")
                .defaultValue("")
                .modelRef(new ModelRef("string"))
                .parameterType("header")
                .required(false)
                .build();
        pars.add(tokenPar.build());
        //添加head参数end

        Docket adminApi = new Docket(DocumentationType.SWAGGER_2)
                .groupName("adminApi")
                .apiInfo(adminApiInfo())
                .select()
                //只显示admin路径下的页面
                .apis(RequestHandlerSelectors.basePackage("com.xx"))
                .paths(PathSelectors.regex("/admin/.*"))
                .build()
                .globalOperationParameters(pars);
        return adminApi;
    }

    private ApiInfo adminApiInfo(){

        return new ApiInfoBuilder()
                .title("后台管理系统-API文档")
                .description("本文档描述了后台管理系统微服务接口定义")
                .version("1.0")
                .contact(new Contact("xx", "http://xx.com", "xx@qq.com"))
                .build();
    }

}

3.3、Controller层添加注解

package com.lhw.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lhw.exception.lhwException;
import com.lhw.model.system.SysRole;
import com.lhw.model.vo.SysRoleQueryVo;
import com.lhw.result.Result;
import com.lhw.service.SysRoleService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.yaml.snakeyaml.events.Event;

import java.util.List;

/**
 * @author xx
 * @Description
 * @date 
 */
@Api(tags = "角色管理接口")
@RestController
@RequestMapping("/admin/system/sysRole")
public class SysRoleController {

    /**
     * http://localhost:8800/doc.html
     */

    @Autowired
    private SysRoleService sysRoleService;

    /**
     * 批量新增
     * @param sysRoleList
     *    @RequestBody(json中的数组格式 -》 java中的list集合)
     * @return
     */
    @ApiOperation("批量新增角色接口")
    @PostMapping("saveBatch")
    public Result saveBatch(@RequestBody List<SysRole> sysRoleList){
        boolean isSuccess = sysRoleService.saveBatch(sysRoleList);
        if (isSuccess){
            return Result.ok();
        }
        else {
            return Result.fail();
        }
    }


}

3.4、实体类层添加注解


import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.lhw.model.base.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Data;


@Data
@Builder
@TableName("sys_role")
public class SysRole extends BaseEntity {
	
	private static final long serialVersionUID = 1L;

	@ApiModelProperty(value = "角色名称")
	@TableField("role_name")
	private String roleName;

	@ApiModelProperty(value = "角色编码")
	@TableField("role_code")
	private String roleCode;

	@ApiModelProperty(value = "角色描述")
	@TableField("description")
	private String description;

}

3.4、测试

测试地址http://localhost:8800/doc.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一篇学会Swagger2(集成knife4j) 的相关文章

  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • Spring Data JPA 应用排序、分页以及 where 子句

    我目前正在使用 Spring JPA 并利用此处所述的排序和分页 如何通过Spring data JPA通过排序和可分页查询数据 https stackoverflow com questions 10527124 how to query
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • Java TestNG 与跨多个测试的数据驱动测试

    我正在电子商务平台中测试一系列商店 每个商店都有一系列属性 我正在考虑对其进行自动化测试 是否有可能有一个数据提供者在整个测试套件中提供数据 而不仅仅是 TestNG 中的测试 我尝试不使用 testNG xml 文件作为机制 因为这些属性
  • JRE 系统库 [WebSphere v6.1 JRE](未绑定)

    将项目导入 Eclipse 后 我的构建路径中出现以下错误 JRE System Library WebSphere v6 1 JRE unbound 谁知道怎么修它 右键单击项目 特性 gt Java 构建路径 gt 图书馆 gt JRE
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • 使用Spring将war文件WEB-INF目录下的资源导入到applicationContext文件中

    我在我的项目中使用 Spring 框架 我想导入下面的所有 xml 资源 文件 WEB INF CustomerService spring integration Jobs applicationContext配置文件中war文件的目录
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s

随机推荐

  • 【Docker】docker基础使用

    文章目录 docker概念 什么是docker docker引擎迭代 docker与虚拟机 docker版本发展 docker基础 docker架构 docker Registry 镜像仓库 镜像仓库使用流程 实际研发镜像仓库使用 不同镜像
  • Spring(三):IoC容器装配Bean(xml配置方式和注解方式)

    XML配置方式 一 三种实例化Bean的方式 1 使用类构造器实例化 默认无参数
  • Pinia的使用方法

    Pinia的作用 作用 Pinia 是 Vue js 的轻量级状态管理库 他可以在组件和页面间共享状态 相关链接 官方网站 https pinia vuejs org 中文文档 https pinia web3doc top introdu
  • Linux驱动(一)之最简单的驱动程序

    1 前言 为什么要有驱动 为了防止像我等小菜程序员写应用程序的时候权限过高直接去操作底层设备 给设备造成不可挽回的损失 所以要过度一下 让大牛们将底层封装好 应用开发工程师只需要通过特定的接口来完成特定的功能就可以了 2 应用 通常情况下
  • Web入门梳理:HTML5

    html5 2008年 HTML5 HTML的新版本 新标准 常用新标签 相关内容可查看 W3C手册 header 文档页面头部 nav 导航链接部分 footer 文档页脚 底部 article 文章 section 章节 区段 asid
  • [从零开始学习FPGA编程-40]:进阶篇 - 设计-竞争与风险Risk或冒险

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 目录 前言 第1章 什么是竞争与风险 1 1 数字电路的竞争与分风险概述 lt
  • jupyter notebook-如何产生动图(生成模型的利器)

    问题描述 当我们在训练生成模型时 如何方便的观察生成图像的质量 毫无疑问动态是最好的效果 IPython中的display模块 Ipython中的display模块可以很好的控制jupyter notebook中每个cell的输出 我们通过
  • 静态方法 和静态变量——Java

    什么是静态方法 也叫类方法 当一个方法前有static时此方法就是一个静态方法 静态方法可以直接通过类名调用 类变量和类方法 类变量 也叫静态变量 由static修饰的变量 也叫静态属性 可以被所有的类对象实例共享 也叫相当于说 一个类创建
  • springboot+mybatisplus+druid配置mysql与clickhouse多数据源配置

    springboot mybatisplus druid配置mysql与clickhouse多数据源配置 1 导入jar包
  • 常见升降压电源原理

    文章目录 一 开关降压电路 buck 二 开关升压电路 boost 三 线性降压电路 一 开关降压电路 buck 电路图 开关闭合时 电源给电感和电容充电 开关断开时 电感作为电源给负载供电 工作时的电压变化 二 开关升压电路 boost
  • 微信小程序框架

    框架 小程序开发框架的目标是通过尽可能简单 高效的方式让开发者可以在微信中开发具有原生 APP 体验的服务 整个小程序框架系统分为两部分 逻辑层 App Service 和 视图层 View 小程序提供了自己的视图层描述语言 WXML 和
  • SAP ABAP 数据填充进EXCEL模板或代码生成EXCEL并维护数据下载到本地

    文章目录 需求 一 针对有EXCEL模板只填充数据的情况 二 没有模板需要凭空生成Excel的情况 如果需要把大量数据整理后转化为excel传向OA 三 检查Excel是否正确安装 四 如果系统中没有ZCL EXCEL 的帮助类 总结 需求
  • jackson的jar包下载

    没必要去csdn的下载频道去付付费下载 这里有最全最新的Jackson的jar包资源 点我即可 评论有朋友说链接失效了 因为现在工作内容与java无关 不知道地址正确与否 但各位仍可一试 更新后的链接
  • Selenium快速入门

    目录 一 Selenium简介 二 Selenium组成 三 Selenium特点 四 Selenium使用 导入pom依赖 下载浏览器驱动 创建一个测试类 获取网页数据 1 Class选择 driver findElement By cl
  • Android平台和java平台 DES加密解密互通程序及其不能互通的原因

    网上的demo一搜一大堆 但是 基本上都是一知半解 包括我 为什么呢 我在尝试分别在两个平台加密的时候 竟然发现Android DES 加密和java DES加密的程序不能互通 就是加密的结果不一样 更不要说Android平台的加密输入作为
  • JAVA内存模型与JVM内存模型的区别

    JAVA内存模型与JVM内存模型的区别 直接进入正题 JAVA内存模型 Java内存模型规定所有的变量都是存在主存中 每个线程都有自己的工作内存 线程堆变量的操作都必须在工作内存进行 不能直接堆主存进行操作 并且每个线程不能访问其他线程的工
  • 计算机网络(互联网组成、计算机通信方式、电路、报文、分组交换、主要性能指标)

    互联网的组成 边缘部分 由主机组成 这部分是用户直接使用的 核心部分 由网络和路由器组成 边缘部分 计算机之间通信 主机A和主机B进行通信 实际上是指 主机A的某个进程和主机B上的另一个进程进行通信 或简称为 计算机之间通信 计算机的进程
  • Python数据库操作手册

    数据库的操作在现在的Python里面已经变得十分的好用 有了一套API标准 下面的就是讲讲如何的去使用这套框架定义 此框架包含以下部分 模块接口 连接对象 游标对象 DBI辅助对象 数据类型与定义 如何实现的提示 从1 0到2 0的变化 例
  • APP上架需要的准备和流程

    一 上架iOS应用市场前的准备 1 选择适合自己的苹果开发者账号 1 个人账号 Individual 费用99美金一年 该账号在App Store销售者只能显示个人的ID 比如zhitian zhang 单人使用 个人账号只能有一个开发者
  • 一篇学会Swagger2(集成knife4j)

    目录 一 Swagger2简介 1 前言 2 Open API是什么 3 Swagger简介 3 1 特性 3 2 组件 二 knife4j 三 内容 3 1 依赖 3 2 配置类 3 3 Controller层添加注解 3 4 测试 sw