Swagger 概念和使用以及遇到的问题

前言

        接口文档对于前后端开发人员都十分重要。尤其近几年流行前后端分离后接口文档又变
成重中之重。接口文档固然重要,但是由于项目周期等原因后端人员经常出现无法及时更新,
导致前端人员抱怨接口文档和实际情况不一致。
        很多人员会抱怨别人写的接口文档不规范,不及时更新。但是当自己写的时候确实最烦
去写接口文档。这种痛苦只有亲身经历才会牢记于心。
        如果接口文档可以实时动态生成就不会出现上面问题。
        Swagger可以完美的解决上面的问题。

Open API 是什么

         Open API规范(OpenAPI Specification)以前叫做 Swagger 规范,是 REST API 的API
描述格式。
Open API 文件允许描述整个API,包括︰
● 每个访问地址的类型。POST 或 GET。I
● 每个操作的参数。包括输入输出参数。
● 认证方法。
● 连接信息,声明,使用团队和其他信息。
        Open API 规范可以使用 YAML 或 JSON 格式进行编写。这样更利于我们和机器进行
阅读。

        OpenAPI规范 (OAS ) 为 REST API 定义了一个与语言无关的标准接口,允许人和计
算机发现和理解服务的功能,而无需访问源代码,文档或通过网络流量检查。正确定义后,
消费者可以使用最少量的实现逻辑来理解远程服务并与之交互。
        然后,文档生成工具可以使用 OpenAPI 定义来显示 API ,使用各种编程语言生成服务
器和客户端的代码生成工具,测试工具以及许多其他用例。

       

个人理解:Swagger 可以自动的将代码转换成  YAML 或 JSON 格式的接口文档,确保接口文档的实时更新,并且减少写接口文档的痛苦。

swagger 的使用

        在中心仓库搜索 springfox-swagger2,直接使用 swagger 不方便,springfox 对 swagger 进行了封装,可以更方便的使用。

链接:https://mvnrepository.com/artifact/io.springfox/springfox-swagger2

        向 Spring 项目中添加 springfox-swagger2 依赖:

<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>3.0.0</version>
</dependency>

        再向项目中添加视图逻辑,这样才可以生成方便查看的接口文档。

        在中心仓库搜索 springfox-swagger-ui

 链接:https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui

向 Spring 项目中添加 springfox-swagger-ui 依赖:

<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>3.0.0</version>
</dependency>

@EnableSwagger2

        @EnableSwagger2 是 springfox 提供的一个注解,代表 swagger2 相关技术开启。 加上该注解后会扫描当前类所在包,以及子包中所有类的注解,做 swagger 文档的定值,一般加在启动类上

/*** @EnableSwagger2 是 springfox 提供的一个注解,代表 swagger2 相关技术开启。* 会扫描当前类所在包,以及子包中所有类的注解,做 swagger 文档的定值* */
@SpringBootApplication
@EnableSwagger2
public class SwaggerApplication {public static void main(String[] args) {SpringApplication.run(SwaggerApplication.class, args);}
}

        一般情况下加上 @EnableSwagger2 后就可以直接访问 http://localhost:8080/swagger-ui.html 查看 swagger ui 的界面了

        但是博主遇到了两个问题,一个是直接报错无法运行,一个是 查看 swagger ui 的界面是 404

错误

直接报错无法运行

        此时博主直接尝试运行遇到了一个错误

        这个问题通常发生在 Spring Boot 2.6 及以上版本中,当整合 Swagger 时,由于Spring MVC的路径匹配策略变更导致的兼容性问题。在Spring Boot 2.6版本之后,默认的路径匹配策略由AntPathMatcher 改为了 PathPatternParser,而Swagger(Springfox)仍然使用AntPathMatcher,这就导致了冲突。

        我通过下面的办法解决了问题:

        修改路径匹配策略:在 application.properties 或 application.yml 配置文件中,添加以下配置来指定使用 AntPathMatcher 作为路径匹配策略:

spring.mvc.pathmatch.matching-strategy=ant_path_matcher

查看 swagger ui 的界面是 404

        我们需要创建一个 SwaggerConfig 配置类,在配置类中添加如下配置:

package com.example.swagger.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;/*** @author 全栈学习笔记* @date 2020/4/19 16:00* @description*/
@Configuration
@EnableSwagger2
public class SwaggerConfig {@Beanpublic Docket createRestApi() {return new Docket(DocumentationType.SWAGGER_2)// 指定构建api文档的详细信息的方法:apiInfo().apiInfo(apiInfo()).select()// 指定要生成api接口的包路径.apis(RequestHandlerSelectors.basePackage("com.example.swagger.controller"))//使用了 @ApiOperation 注解的方法生成api接口文档//.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)).paths(PathSelectors.any())//可以根据url路径设置哪些请求加入文档,忽略哪些请求.build();}/*** 设置api文档的详细信息*/private ApiInfo apiInfo() {return new ApiInfoBuilder()// 标题.title("Spring Boot集成Swagger2")// 接口描述.description("swagger")// 版本信息.version("1.0")// 构建.build();}
}

        就可以正常访问到我们的 swagger ui 界面了

使用 swagger ui 检查接口是否正确

        首先我们先写一些接口类:

@RestController
public class MyController {@GetMapping("/get")public String get(String id){return "get";}@PostMapping("/post")public String post(String id,String name){return "post";}@RequestMapping("/req")public String req(){return "req";}
}

        注意:要在 SwaggerConfig 配置类中加上 MyController  类的包名

        再次访问 swagger ui 界面可以看到已经有了接口信息

        点击一个接口我们可以看到该接口的详细信息,点击 Try it out 可以发起请求检测接口的返回信息

        在方框中输入要传递的参数值 id=1

        点击 Execute 发送请求

        在下面的信息栏就可以查看接口返回的信息,判断接口是否正常工作

swagger 常用注解

@Api 描述类

        用于描述当前类型生成帮助文档的信息(该注解只能用于类上)

属性:

        tags :给当前类型定义别名,可以定义多个。定义几个别名,就在 ui 视图中显示几个控制器访问菜单。

        description :给当前类型生成的帮助文档定义一个描述信息(已经过时了)

@RestController
@RequestMapping("/MyController")
/*** @Api - 描述当前类型生成帮助文档的信息* 属性-*  - tags :给当前类型定义别名,可以定义多个。定义几个别名,就在 ui 视图中显示几个控制器访问菜单。*  - description :给当前类型生成的帮助文档定义一个描述信息(已经过时了)* */
@Api(tags = {"MyController","swagger学习控制器"},description = "测试 api 信息")
public class MyController {@GetMapping("/get")public String get(String id){return "get";}@PostMapping("/post")public String post(String id,String name){return "post";}@RequestMapping("/req")public String req(){return "req";}
}

        可以看到给 MyController 类设置别名后出现了一个新的控制器访问菜单

@ApiOperation 描述方法

        用于描述方法的信息(该注解可以用于类上和方法上,但通常用于方法上)

属性:

        value:对方法的描述信息

        notes:对方法的提示信息 (两个属性的信息所在位置不同)

@RestController
@RequestMapping("/MyController")@Api(tags = {"MyController","swagger学习控制器"},description = "测试 api 信息")
public class MyController {@ApiOperation(value = "get方法,获取客户 id ",notes = "swagger 学习使用 - 处理 GET 请求的方法")@GetMapping("/get")public String get(String id){return "get";}@PostMapping("/post")public String post(String id,String name){return "post";}@RequestMapping("/req")public String req(){return "req";}
}

        如下图,get 方法后有描述信息,post 方法后没有描述信息

点开接口详情,可以看到对该接口的提示信息

@ApiParam 描述参数

        用于描述参数的信息

属性:

        name:参数名称

        value:对参数的描述信息

        required:该参数是否必须(默认是 false)

@RestController
@RequestMapping("/MyController")@Api(tags = {"MyController","swagger学习控制器"},description = "测试 api 信息")
public class MyController {@ApiOperation(value = "get方法,获取客户 id ",notes = "swagger 学习使用 - 处理 GET 请求的方法")@GetMapping("/get")public String get(String id){return "get";}@PostMapping("/post")public String post(@ApiParam(name = "用户 id ",value = "新增用户时用的用户 id ",required = true) String id,@ApiParam(name = "用户名",value = "新增用户时用的用户名",required = true) String name){return "post";}@RequestMapping("/req")public String req(){return "req";}
}

        可以看到属性有了详细的描述信息

@ApiIgnore 忽略

        忽略该注解描述的方法和类,不生产 api 帮助文档

    // @ApiIgnore - 忽略该注解描述的方法和类,不生成 api 帮助文档@ApiIgnore@RequestMapping("/req")public String req(){return "req";}

        如同,添加后由 RequestMapping 产生的多个接口的文档都消失了

@ApiImplicitParams 在方法前描述参数

        在方法前描述参数。

属性:

        name:参数名称

        value:对参数的描述信息

        required:该参数是否必须(默认是 false)

        paramType:该参数的类型

@RestController
@RequestMapping("/MyController")@Api(tags = {"MyController","swagger学习控制器"},description = "测试 api 信息")
public class MyController {@ApiOperation(value = "get方法,获取客户 id ",notes = "swagger 学习使用 - 处理 GET 请求的方法")@GetMapping("/get")@ApiImplicitParams(value = {@ApiImplicitParam(name = "id",value = "前端获取用户id",paramType = "int",required = true),@ApiImplicitParam(name = "name",value = "前端获取用户名",paramType = "字符串")})public String get(String id,String name){return "get";}@PostMapping("/post")public String post(@ApiParam(name = "用户 id ",value = "新增用户时用的用户 id ",required = true) String id,@ApiParam(name = "用户名",value = "新增用户时用的用户名",required = true) String name){return "post";}// @ApiIgnore - 忽略该注解描述的方法和类,不生成 api 帮助文档@ApiIgnore@RequestMapping("/req")public String req(){return "req";}
}

        作用和 @ApiParam 相同,只是写在方法上而已

@ApiModel 与 @ApiModelProperty 描述实体类型

        @ApiModel 与 @ApiModelProperty 描述实体类型,这个实体类型如果成为了接口的返回类型并且该接口生成了接口文档,那么此注解会被解析,生成描述实体类型的文档

@ApiModel(value = "学生实体 - Student ",description = "存储学生信息")
public class Student{@ApiModelProperty(value = "主键",name = "主键(id)",required = true,example = "q",hidden = false)private String id;  //主键@ApiModelProperty(value = "姓名",name = "姓名(name)",required = true,example = "张三",hidden = false)private String name;    //姓名@ApiModelProperty(value = "密码",name = "密码(password)",required = true,example = "123456",hidden = false)private String password;    //密码public Student(){};public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}
    @GetMapping("/getStudentInfo")public Student getStudentInfo(){return new Student();}

        如图,可以查看实体的详细信息

@ApiModel

        描述实体类

属性:

        value:该实体的名称

        description:该实体的描述

@ApiModelProperty

        描述实体类的属性

属性:

        name:属性的名称

        value:属性的描述

        required:是否必须

        example:示例

        hidden:是否隐藏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/144841.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

dll注入的实现及session0注入

记录一下跟着红队蓝军师傅学免杀的过程 本节旨在学习dll注入和代码实现并不涉及免杀知识 dll注入流程 dll注入要么注入自己写的程序要么找个程序进行注入&#xff0c;一般是找其他程序进行注入 所以按照上面的步骤进行 其中申请空间&#xff0c;创建线程都是在远程的另一个进…

【Linux】-----进程第一弹

目录 概念 描述进程-PCB 查看进程 获取进程标识符 终止进程 fork创建进程 返回值说明 进程的状态 ①运行状态(R) ②浅度睡眠(S) ③深度睡眠(D) ④暂停状态(T) ⑤僵尸状态(Z)(重点) 是什么&#xff1f; 举例 危害 孤儿进程 ⑥死亡状态(X) 概念 课本上对于进程…

土豆王国小乐队携手阿派朗创造力乐园,打造2024年okgo儿童音乐节

艺术与科技的完美融合&#xff0c;为首都少年儿童带来音乐盛宴 北京&#xff0c;2024年9月19日 —— 备受期待的2024年okgo儿童音乐节即将于9月21日至22日在北京阿派朗创造力乐园盛大开幕。这场由土豆王国小乐队与阿派朗创造力乐园联合举办的音乐节&#xff0c;旨在为首都及全国…

【828华为云征文|华为云Flexus X实例部署指南:轻松搭建可道云KODBOX项目】

文章目录 华为云 Flexus X 实例&#xff1a;引领高效云服务的新时代部署【可道云KODBOX】项目准备工作具体操作指南服务器环境确认宝塔软件商店操作域名解析可道云KODBOX登录页效果验证 总结 华为云 Flexus X 实例&#xff1a;引领高效云服务的新时代 在云计算领域&#xff0c…

基于Ubuntu22.04的cups安装与配置

目录 关于cups 关于cups Linux中的CUPS(Common UNIX Printing System,通用UNIX打印系统)是一个开源的打印系统,它提供了一套完整的管理打印设备、实现可靠打印和网络打印的方案。 Cups安装与与配置 1、升级系统 sudo apt update -y && sudo apt upgrade -y 2、安…

代码随想录算法训练营43期 | Day 20 —— 235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

代码随想录算法训练营 代码随想录算法训练营43期235.二叉搜索树的最近公共祖先701.二叉搜索树中的插入操作450.删除二叉搜索树中的节点 代码随想录算法训练营43期 235.二叉搜索树的最近公共祖先 解题思路&#xff1a; 二叉搜索树一定是有序的 判断条件&#xff1a; cur>p &…

MySQL索引知识个人笔记总结(持续整理)

本篇笔记是个人整理的索引知识总结&#xff0c;刚开始有点乱&#xff0c;后续会一直边学边整理边总结 索引&#xff08;index&#xff09;是帮助MySQL高效获取数据的数据结构(有序)。就好比索引就是数据的目录 索引结构 Btree索引,Hash索引,Full-text索引&#xff0c;R-tree(空…

【第十二章:Sentosa_DSML社区版-机器学习回归】

【第十二章&#xff1a;Sentosa_DSML社区版-机器学习回归】 12.1 线性回归 1.算子介绍 线性回归模型(BuildLRNode)是一个非常经典有效的回归模型&#xff0c;它假设所有特征变量和目标变量之间存在线性关系。通过训练来求得各个特征的权重以及截距。同时可以通过L1&#xff0…

GDPU 信息安全 天码行空1 用Wireshark分析典型TCP/IP体系中的协议

文章目录 一、实验目的二、实验内容三、实验步骤1. ICMP&#xff08;控制报文&#xff09;2. IPV4第一个包&#xff08;IPv4&#xff09;第二个包&#xff08;IPv4&#xff09;第三个包&#xff08;ICMP&#xff09; 3. TCP 三次握手 一、实验目的 通过Wireshark软件分析典型网…

网络安全 DVWA通关指南 DVWA Stored Cross Site Scripting (存储型 XSS)

DVWA Stored Cross Site Scripting (存储型 XSS) 文章目录 DVWA Stored Cross Site Scripting (存储型 XSS)XSS跨站原理存储型 LowMediumHighImpossible 参考文献 WEB 安全靶场通关指南 XSS跨站原理 当应用程序发送给浏览器的页面中包含用户提交的数据&#xff0c;但没有经过适…

对 JavaScript 原型的理解

笔者看了一些有关 JavaScript 原型的文章有感而发&#xff0c;就将所感所悟画了下来如果有理解错误和不足的地方&#xff0c;欢迎各位大佬指出&#xff0c;笔者感激不尽

搜索专利的方法

最近发现谷歌可以搜索专利的申请情况&#xff0c;比如&#xff1a; 谷歌专利 https://patents.google.com/?q%E5%B0%8F%E7%B1%B3&inventor%E9%9B%B7%E5%86%9B https://patents.google.com/ 就可以看到这位老兄申请了14个专利&#xff0c;点开可以看到里面的明细&#xff…

佰朔资本:沪指企稳反弹 半导体板块全天强势

降息预期提振金融板块 昨日午后&#xff0c;大金融板块明显发力&#xff0c;成为引领指数企稳上升的重要力气。到收盘&#xff0c;申万银行指数涨1.00%&#xff0c;工商银行涨超2%&#xff0c;招商银行、建设银行、农业银行等涨超1%&#xff1b;申万非银金融指数涨0.81%&#…

C++ 中的继承(详细讲解)

一、继承的概念以及定义 1、继承概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保 持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象 程序设计的…

Python开发深度学习常见安装包 error 解决

Python Python 是一种广泛使用的高级编程语言&#xff0c;它以其清晰的语法和代码可读性而闻名。Python 支持多种编程范式&#xff0c;包括面向对象、命令式、函数式和过程式编程。由于其简洁性和强大的标准库&#xff0c;Python 成为了数据科学、机器学习、网络开发、自动化脚…

CTFshow——萌新隐写(未完待续)

萌新隐写2 首先暴力破解密码&#xff0c;初始密码设为19000000即可 我用的是ziperello 萌新隐写3 萌新隐写4 word打开 - > 打开设置 - > 隐藏文字 - >flag出现 萌新隐写5 中文转unicode 16进制转字符串 base32解码 萌新隐写6 暂时不会。。。。 隐写1 打开就看到头是…

FPGA随记-二进制转格雷码

反射二进制码&#xff08;RBC&#xff09;&#xff0c;也称为反射二进制&#xff08;RB&#xff09;或格雷码&#xff08;Gray code&#xff09;&#xff0c;得名于Frank Gray&#xff0c;是二进制数制的一种排列方式&#xff0c;使得连续两个值之间仅有一个比特&#xff08;二…

组装电脑-电脑配置

键盘、鼠标&#xff1a;买一百多的机械盘。 主板 电脑台式机主板是计算机最基本的同时也是最重要的部件之一&#xff0c;它在整个计算机系统中扮演着举足轻重的角色。以下是对它的详细介绍&#xff1a; 基础功能&#xff1a; 主板作为计算机的核心部件&#xff0c;负责连接和…

嵌入式C语言自我修养:C语言的模块化的编程思想

不同模块如何集成到系统中去&#xff1f; 模块的编译和链接 一个C语言项目划分成不同的模块&#xff0c;通常由多个文件来实现。在项目编译过程中&#xff0c;编译器是以C源文件为单位进行编译的&#xff0c;每一个C源文件都会被编译器翻译成对应的一个目标文件。链接器对每一个…

【计算机基础题目】二叉树的前序中序后续遍历之间相互转换 详细例子

创作日志&#xff1a; 笔试题目&#xff0c;掌握了技巧之后这道题就是 so easy~ 一、 1、已知二叉树的 前序和中序&#xff0c;可以求出后序 2、已知二叉树的 中序和后序&#xff0c;可以求出前序 3、已知二叉树的 前序和后序&#xff0c;无法求出唯一的中序 二、求法 求法是…