Swagger & Knife4j

2023-11-10

Swagger & Knife4j

1 Swagger介绍

(1)简介

Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务(https://swagger.io/)。 它的主要作用是:

  1. 使得前后端分离开发更加方便,有利于团队协作

  2. 接口的文档在线自动生成,降低后端开发人员编写接口文档的负担

  3. 功能测试

    Spring已经将Swagger纳入自身的标准,建立了Spring-swagger项目,现在叫Springfox。通过在项目中引入Springfox ,即可非常简单快捷的使用Swagger。

(2)SpringBoot集成Swagger

  • 引入依赖,在【itheima-leadnews】模块中引入该依赖

    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.9.2</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>2.9.2</version>
    </dependency>
    
  • 添加一个配置类


@Configuration
@EnableSwagger2
public class SwaggerConfiguration {

   @Bean
   public Docket buildDocket() {
      HashSet<String> strings = new HashSet<>();
      strings.add("application/json");

      return new Docket(DocumentationType.SWAGGER_2)
              .apiInfo(buildApiInfo())
              //设置返回值数据类型为json
              .produces(strings)
              .select()
              // 要扫描的API(Controller)基础包
              .apis(RequestHandlerSelectors.basePackage("com.mingye"))
              .paths(PathSelectors.any())
              .build();
   }

   private ApiInfo buildApiInfo() {
      Contact contact = new Contact("Ming","","");
      return new ApiInfoBuilder()
              .title("Ming-管理API文档")
              .description("服务api")
              .contact(contact)
              .version("1.0.0").build();
   }
}

启动工程后访问:http://localhost:9001/swagger-ui.html

(3)Swagger常用注解

@Api:修饰整个类,描述Controller的作用

@ApiOperation:修饰类的一个方法 标识 操作信息 接口的定义

@ApiParam:单个参数的描述信息

@ApiModel:描述使用到的对象信息

@ApiModelProperty:描述使用到的对象的属性信息

@ApiResponse:HTTP响应其中1个描述

@ApiResponses:HTTP响应整体描述

@ApiIgnore:使用该注解忽略这个API

@ApiError :发生错误返回的信息

@ApiImplicitParam:一个请求参数

@ApiImplicitParams:多个请求参数的描述信息

@ApiImplicitParam属性:

属性 取值 作用
paramType 查询参数类型
path 以地址的形式提交数据
query 直接跟参数完成自动映射赋值
body 以流的形式提交 仅支持POST
header 参数在request headers 里边提交
form 以form表单的形式提交 仅支持POST
dataType 参数的数据类型 只作为标志说明,并没有实际验证
Long
String
name 接收参数名
value 接收参数的意义描述
required 参数是否必填
true 必填
false 非必填
defaultValue 默认值

我们在controller中添加Swagger注解,代码如下所示:

@Api(tags = "管理")
public class AdChannelController {
    
}

在vo,dto或实体类中添加api相关注解:

@Data
@ApiModel(value="PageRequestDto", description="通用分页查询参数")
public class PageRequestDto implements Serializable {

    @ApiModelProperty(notes = "每页大小", dataType="Long")
    private Long size;
    @ApiModelProperty(notes = "页码", dataType="Long")
    private Long page;

    public void checkParam() {
        if (this.page == null || this.page < 0) {
            setPage(1l);
        }
        if (this.size == null || this.size < 0 || this.size > 100) {
            setSize(10l);
        }
    }
}

/**
 * @version 1.0
 * @description 说明
 */
@Data
@ApiModel(value="PageResultVo", description="通用分页响应结果")
public class PageResultVo<T> extends ResultVo<T> implements Serializable {
    @ApiModelProperty(notes = "页码", dataType="Long")
    private Long currentPage;
    @ApiModelProperty(notes = "每页大小", dataType="Long")
    private Long size;
    @ApiModelProperty(notes = "总记录数", dataType="Long")
    private Long total;

    /**
     * 快速构建分页结果
     * @param page
     * @param size
     * @param total
     * @param data
     * @return
     */
    public static <T>PageResultVo<T> pageResult(Long page, Long size, Long total, List<T> data){
        PageResultVo vo = new PageResultVo();
        vo.setCurrentPage(page);
        vo.setSize(size);
        vo.setTotal(total);
        vo.setData(data);
        return vo;
    }
}

/**
 * @version 1.0
 * @description 通用响应结果
 */
@Data
@AllArgsConstructor
@ApiModel(value="ResultVo", description="通用响应结果")
public class ResultVo<T> implements Serializable {
    @ApiModelProperty(notes = "响应请求域名", dataType="String")
    private String host;
    @ApiModelProperty(notes = "响应状态码", dataType="Integer")
    private Integer code;
    @ApiModelProperty(notes = "响应提示信息", dataType="String")
    private String errorMessage;
    @ApiModelProperty(notes = "响应数据", dataType="JSON")
    private T data;

    public ResultVo() {
        this.code = HttpCodeEnum.SUCCESS.getCode();
    }

    public static ResultVo ok() {
        return new ResultVo();
    }

    public static ResultVo ok(String msg) {
        return new ResultVo(null,HttpCodeEnum.SUCCESS.getCode(),msg,null);
    }

    public static ResultVo ok(Object data) {
        return new ResultVo(null,HttpCodeEnum.SUCCESS.getCode(),HttpCodeEnum.SUCCESS.getMessage(),data);
    }
    public static ResultVo error() {
        return ResultVo.error(HttpCodeEnum.SERVER_ERROR);
    }
    public static ResultVo error(int code, String msg) {
        return new ResultVo(null,code,msg,null);
    }
    public static ResultVo error(HttpCodeEnum enums){
        return ResultVo.error(enums.getCode(),enums.getMessage());
    }
    public static ResultVo bizError(String msg) {
        return ResultVo.error(HttpCodeEnum.SERVER_ERROR.getCode(), msg);
    }

    public boolean isSuccess(){
        return this.code!=null&&this.code.intValue()==HttpCodeEnum.SUCCESS.getCode();
    }
}

/**
 * @version 1.0
 * @description 频道实体类
 */
@Data
@TableName("ad_channel")
@ApiModel(description = "频道实体")
public class AdChannel {

    @TableId(value = "id", type = IdType.AUTO)
    @ApiModelProperty(notes = "主键id")
    private Integer id;

    @TableField("name")
    @ApiModelProperty(notes = "名称")
    private String name;

    @TableField("description")
    @ApiModelProperty(notes = "描述")
    private String description;

    @TableField("is_default")
    @ApiModelProperty(notes = "是否为默认")
    private Boolean isDefault;

    @TableField("status")
    @ApiModelProperty(notes = "是否启用")
    private Boolean status;

    @TableField("ord")
    @ApiModelProperty(notes = "排序")
    private Integer ord;

    @TableField("created_time")
    @ApiModelProperty(notes = "创建时间")
    private Date createdTime;
}

启动admin微服务,访问地址:http://localhost:9001/swagger-ui.html

官方的注解说明如下:

https://github.com/swagger-api/swagger-core/wiki/Annotations-1.5.X

仅仅是这样,那么如果有离线需求呢?如果服务器换地方了呢?在线调试还不够完善,阅读相对麻烦,UI功能不是特别强,软件 Knife4j 做了一次增强。

2 Knife4j

(1)简介

knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名kni4j是希望它能像一把匕首一样小巧,轻量,并且功能强悍!

gitee地址:https://gitee.com/xiaoym/knife4j

官方文档:https://doc.xiaominfo.com/

效果演示:http://knife4j.xiaominfo.com/doc.html

(2)核心功能

该UI增强包主要包括两大核心功能:文档说明 和 在线调试

  • 文档说明:根据Swagger的规范说明,详细列出接口文档的说明,包括接口地址、类型、请求示例、请求参数、响应示例、响应参数、响应码等信息,使用swagger-bootstrap-ui能根据该文档说明,对该接口的使用情况一目了然。
  • 在线调试:提供在线接口联调的强大功能,自动解析当前接口参数,同时包含表单验证,调用参数可返回接口响应内容、headers、Curl请求命令实例、响应时间、响应状态码等信息,帮助开发者在线调试,而不必通过其他测试工具测试接口是否正确,简介、强大。
  • 个性化配置:通过个性化ui配置项,可自定义UI的相关显示信息
  • 离线文档:根据标准规范,生成的在线markdown离线文档,开发者可以进行拷贝生成markdown接口文档,通过其他第三方markdown转换工具转换成html或pdf,这样也可以放弃swagger2markdown组件
  • 接口排序:自1.8.5后,ui支持了接口排序功能,例如一个注册功能主要包含了多个步骤,可以根据swagger-bootstrap-ui提供的接口排序规则实现接口的排序,step化接口操作,方便其他开发者进行接口对接

(3)快速集成

  • 在工程中pom.xml文件中引入knife4j的依赖,并【删除掉原来的swagger的依赖】如下:
<dependency>
     <groupId>com.github.xiaoymin</groupId>
     <artifactId>knife4j-spring-boot-starter</artifactId>
</dependency>

如果是高版本springboot已经去除掉了validation 还需要在工程中添加依赖,因为knife4j需要使用到他

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
  • 创建Swagger配置文件

新建Swagger的配置文件SwaggerConfiguration.java文件,创建springfox提供的Docket分组对象,代码如下:

@Configuration
@EnableSwagger2
@EnableKnife4j
@Import(BeanValidatorPluginsConfiguration.class)
public class SwaggerConfiguration {

   @Bean
   public Docket buildDocket() {
      HashSet<String> strings = new HashSet<>();
      strings.add("application/json");

      return new Docket(DocumentationType.SWAGGER_2)
              .apiInfo(buildApiInfo())
              //设置返回值数据类型为json
              .produces(strings)
              .select()
              // 要扫描的API(Controller)基础包
              .apis(RequestHandlerSelectors.basePackage("Ming"))
              .paths(PathSelectors.any())
              .build();
   }

   private ApiInfo buildApiInfo() {
      Contact contact = new Contact("Ming","","");
      return new ApiInfoBuilder()
              .title("Ming-API文档")
              .description("管理服务api")
              .contact(contact)
              .version("1.0.0").build();
   }
}

以上有两个注解需要特别说明,如下表:

注解 说明
@EnableSwagger2 该注解是Springfox-swagger框架提供的使用Swagger注解,该注解必须加
@EnableKnife4j 该注解是knife4j提供的增强注解,Ui提供了例如动态参数、参数过滤、接口排序等增强功能,如果你想使用这些增强功能就必须加该注解,否则可以不用加

修改AdChannelController添加Api说明

/**
 * @version 1.0
 * @description 频道管理
 */
@RestController
@RequestMapping("/channel")
@Api(tags = "管理")
public class AdChannelController {

    @Autowired
    private AdChannelService adChannelService;

    /**
     * 分页查询
     * @param dto
     * @return
     */
    @PostMapping("/list")
    @ApiOperation("分页查询")
    public PageResultVo pageList(@RequestBody ChannelPageRequestDto dto){
        PageResultVo vo = adChannelService.pageList(dto);
        return vo;
    }
}

修改dto添加api说明

/**
 * @version 1.0
 * @description 说明
 */
@Data
@ApiModel(value="ChannelPageRequestDto", description="分页查询参数")
public class ChannelPageRequestDto extends PageRequestDto {
    @ApiModelProperty(notes = "名称",dataType = "String")
    private String name;
    @ApiModelProperty(notes = "状态",dataType = "Integer")
    private Integer status;
}

  • 访问

在浏览器输入地址:http://localhost:9001/doc.html

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

Swagger & Knife4j 的相关文章

  • 无法在类对象的 ArrayList 中存储值。 (代码已编辑)

    这基本上是一个 Java 代码转换器 它涉及一个 GUI 让用户输入类类型 名称和方法 为了存储值 我创建了一个类VirtualClass与ArrayList
  • jvm 次要版本与编译器次要版本

    当运行使用具有相同主要版本但次要版本高于 JVM 的 JDK 编译的类时 JVM 会抛出异常吗 JDK 版本并不重要 类文件格式版本 http blogs oracle com darcy entry source target class
  • 在哪里可以获得有关 Java FitNesse 和 Slim 的一些教程? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何比较 Struts 2 中 url 请求参数中的单个字符

    我正在读取具有单个字符的 url 参数 它将是Y or N 我必须写一个条件来检查它是否Y or N并做相应的事情 这是我写的 但似乎不起作用 总是转到其他地方 网址是
  • 正则表达式获取字符串中的第一个数字和其他字符

    我是正则表达式的新手 想知道如何才能只获取字符串中的第一个数字 例如100 2011 10 20 14 28 55 在这种情况下 我希望它返回100 但该数字也可以更短或更长 我在想类似的事情 0 9 但它单独获取每个数字 100 2001
  • Java Microsoft Excel API [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 有多少种方法可以将位图转换为字符串,反之亦然?

    在我的应用程序中 我想以字符串的形式将位图图像发送到服务器 我想知道有多少种方法可以将位图转换为字符串 现在我使用 Base64 格式进行编码和解码 它需要更多的内存 是否有其他可能性以不同的方式做同样的事情 从而消耗更少的内存 现在我正在
  • 如何导入 org.apache.commons.lang3.ArrayUtils;进入 Eclipse [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我如何导入 org apache commons lang3 ArrayUtils 将库添加到 Ecl
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • Java:java.util.ConcurrentModificationException

    我正在制作 2D 目前正在研究用子弹射击 子弹是一个单独的类 所有项目符号都存储在称为项目符号的数组列表中 当它超出屏幕一侧 Exception in thread main java util ConcurrentModification
  • 带有 OpenId 提供程序的 Java Spring 安全性

    我有一个 spring MVC 应用程序 另一个客户端应用程序想要使用 open id connect 访问我的 spring 应用程序 如何在服务器端实现开放ID提供商 请帮忙 MITREid 连接 OpenID Connect Java
  • JSch中如何设置文件类型和文件传输模式?

    我使用 Apache Common NetFTPClient并设置了我的ftpClient在上传文件之前使用如下所示的方法 ftpClient setFileType FTP BINARY FILE TYPE ftpClient setFi
  • 改变for循环的顺序?

    我遇到一种情况 我需要根据用户输入以不同的顺序循环遍历 xyz 坐标 所以我是 3D 空间中的一个区域 然后是一组像这样的 for 循环 for int x 0 x lt build getWidth x for int y 0 y lt
  • 如何初始化静态地图?

    你会如何初始化静态Map在Java中 方法一 静态初始化方法二 实例初始化 匿名子类 或者 还有其他方法吗 各自的优点和缺点是什么 这是说明这两种方法的示例 import java util HashMap import java util
  • Java:由 HTTP 连接创建的等待连接线程存活时间很长

    我有一个服务器端代码 用于检查 SOAP 服务是否已启动 代码如下 String response while response length 0 try final URL url new URL DummySoapServiceURL
  • 无法使用 wget 在 CentOS 机器上安装 oracle jdk

    我想在CentOS上安装oracle java jdk 8 我无法安装 java jdk 因为当我尝试使用命令安装 java jdk 时 root ADARSH PROD1 wget no cookies no check certific
  • 失败时石英重试

    假设我有一个这样配置的触发器
  • 摩尔斯电码 至 英语

    我现在的问题是让 摩尔斯电码转英语 正常工作 将英语转换为莫尔斯电码的第一部分工作正常 我知道以前已经有人问过这个问题 但我不知道我做错了什么 我知道我需要在某个地方进行拆分 但我只是不确定将其放在代码中的何处 现在 莫尔斯电码到英语的部分
  • 每次我们调用浏览器时,在 selenium 中使用 driver.manage().window().maximize() 是否好?

    We use driver manage window maximize 最大化浏览器 我在网上看到一些使用的例子driver manage window maximize 尽管不需要最大化浏览器 例如 gmail 登录 我还看到使用 se
  • Java:使用 Graph API 在线更新 Sharepoint 上的 docx 文件

    我在使用 Java 在线更新 Sharepoint 上的 docx 文件时遇到问题 首先 我检查了构建 PUT 请求的 URL 此处 并使用此请求 PUT drives drive id items item id content 我首先使

随机推荐

  • 【NLP】使用递归神经网络对序列数据进行建模 (Pytorch)

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • Linux截取字符串最后两位,linux的string操作(字符串截取,长度计算)

    按指定的字符串截取 1 第一种方法 varible string 从左向右截取最后一个string后的字符串 varible string 从左向右截取第一个string后的字符串 varible string 从右向左截取最后一个stri
  • 2022年,中国餐饮数字化进行到哪一步了?

    在餐饮数字化的进程中 企业有收获 但更多的却是失落 作者 斗斗 编辑 皮爷 出品 产业家 美团供应链里 有两个采购协议 要货协议的功能 在我看来就是一样的 十分鸡肋 黄晓辉为此还找到美团负责该业务的负责人 想要解答他的疑惑 他们业务负责人甚
  • 大数据毕设选题 - 深度学习股票预测系统(python Django)

    文章目录 0 前言 1 课题背景 2 实现效果 3 Django框架 4 数据整理 5 模型准备和训练 6 最后 0 前言 Hi 大家好 这里是丹成学长的毕设系列文章 对毕设有任何疑问都可以问学长哦 这两年开始 各个学校对毕设的要求越来越高
  • c#对接webservice接口

    方式一 需要填写地址 不能映射每个方法 工具类 using System using System CodeDom Compiler using System CodeDom using System Collections Generic
  • Win系统下安装Linux双系统教程(非常详细)从零基础入门到精通,看完这一篇就够了

    软件下载 软件 Linux 版本 18 0 4 语言 简体中文 大小 1 82G 安装环境 Win11 Win10 Win8 Win7 硬件要求 CPU 2 0GHz 内存 4G 或更高 下载通道 丨百度网盘 1 ubuntu18 0 4下
  • 【供应链架构day9】美团配送系统架构的演进之路:从MVP到规模化

    本文是美团永俊老师的分享 写在前面 美团配送自成立以来 业务经历了多次跨越式的发展 业务的飞速增长 对系统的整体架构和基础设施提出了越来越高的要求 同时也不断驱动着技术团队深刻理解业务 准确定位领域模型 高效支撑系统扩展 如何在业务高速增长
  • 杜比的音效生意

    转自 http tech sina com cn it 2010 08 25 13474586814 shtml 这家追求声音效果的企业 在其专利技术的基础上 不断延展自己的产业链 获得了高速成长 作者 陈庆春 杜比在中国消费电子市场有着非
  • 单元测试出现Class not found

    使用SpringBoot项目进行单元测试时 出现Class not found的报错 之前我是删除过测试部分 后来自己再写上去的 之后点击Maven的test 如下图 在运行就可以了
  • 差分GPS-RTK-千寻

    目录 GPS和GNSS的区别 差分GPS定位原理 1 位置差分原理 略 2 伪距差分原理 DGPS 3 载波相位差分原理 RTK 重点 千寻位置 GPS和GNSS的区别 GPS 指全球定位系统 Global Positioning Syst
  • UE4 FTP Client插件

    封装了ftplib的库 https github com mkulke ftplibpp 插件地址 https github com HeartlessLD UE4 FTPPlugin 这里大致说一下注意事项 可能有不全的 具体看代码 1
  • 【满分】【华为OD机试真题2023 JS】任务混部

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 任务混部 知识点差分 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 公司创新实验室正在研究如何最小化资源成本 最大化资源利用率 请你设计算法帮他们解决一个任务混
  • matlab 多核计算设置2

    由于处理器时钟频率的限制 增加核并不意味着是计算性能的提高 为了充分利用新的多核硬件在性能上的优势 软件的基层结构需要向并行计算转换 MATLAB并行计算工具箱就是这种需求的产物 它能很好地实现在多核系统上进行并行运算 文章以典型的数值计算
  • xray config.yaml文件配置出错解决

    开启监听时 出现 could not find expected 解决办法 xray 安全评估工具文档 去mitm模块复制一下粘贴到config中 mitm ca cert ca crt CA 根证书路径 ca key ca key CA
  • PAT (Basic Level) 1045 柳婼、旭神两大思路分析【测试点】样例

    1045 快速排序 25 分 著名的快速排序算法里有一个经典的划分过程 我们通常采用某种方法取一个元素作为主元 通过交换 把比主元小的元素放到它的左边 比主元大的元素放到它的右边 给定划分后的 N 个互不相同的正整数的排列 请问有多少个元素
  • 将字符串转化为16进制数

    在有些情况下 想得到n个16进制数 然而你只能得到一个字符串数组 数组中的数据都是文本形式 例如char s 1b5050508af890ef50 我想得到的是16进制数1b 50 而数组中的字符 每一位都可以转化为一个16进制数 1b转为
  • Python实现简易语音转文字功能模块

    1 实现功能 WAV格式的音频 gt 文字 2 代码实现 import speech recognition as sr from os import path global content 语音 gt 文字 def voice2Text
  • 数学期望 极小值的几种求法

    前言 其中一维搜索方法这种思想 在图像二值化里面有应用 像二维码算法里面的条形码二值化 就是这种算法的进阶版 缺点是只能按照一个方向进行搜索 且步伐需要调整 目录 数学期望例子 一维搜索方法求极值 黄金分隔法求极值 一 数学期望例子 普查某
  • Oracle case when 详解

    文章目录 1 概述 2 示例 when 执行顺序 3 ORA 06592 执行 CASE 语句时未找到 CASE 1 概述 1 case when 条件判断语句 1 相当于其它语言中的 if else 2 部分情况下 等同于 decode
  • Swagger & Knife4j

    Swagger Knife4j 1 Swagger介绍 1 简介 Swagger 是一个规范和完整的框架 用于生成 描述 调用和可视化 RESTful 风格的 Web 服务 https swagger io 它的主要作用是 使得前后端分离开