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

news2024/9/20 5:49:25

前言

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

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

相关文章

一个手机号注册3个抖音号的绿色方法?一个人注册多个抖音号的方法!

下面这是我注册的新账号&#xff0c;显示未实名&#xff0c;在手机号这里显示辅助手机号绑定&#xff0c;手机号绑定这里显示未绑定。如果你需要矩阵&#xff0c;那么&#xff0c;还需要设置好头像&#xff0c;以及介绍&#xff0c;这些都可以正常设置。 再好的方法&#xff0c…

【IPV6从入门到起飞】5-5 IPV6+Home Assistant(HACS商店安装)docker版本安装

IPV6Home Assistant[HACS商店安装]docker版本安装 1 背景2 下载HACS3 安装/启用 HACS4 拓展安装 1 背景 在hass中&#xff0c;是有在线商店供我们下载插件&#xff0c;用于美化hass以及拓展功能&#xff0c;但是在docker版本中&#xff0c;默认是没有的&#xff0c;开启高级模…

【有啥问啥】深入解析:机器学习中的过拟合与欠拟合

深入解析&#xff1a;机器学习中的过拟合与欠拟合 在机器学习中&#xff0c;过拟合&#xff08;overfitting&#xff09;和欠拟合&#xff08;underfitting&#xff09;是模型性能中常见的两大挑战。它们反映了模型的学习能力与泛化能力的不平衡&#xff0c;直接影响模型在训练…

【machine learning-九-梯度下降】

梯度下降 更加通用的梯度下降算法算法步骤 上一节讲过&#xff0c;随机的寻找w和b使损失最小不是一种合适的方法&#xff0c;梯度下降算法就是解决解决这个问题的&#xff0c;它不仅可以用于线性回归&#xff0c;还可以用于神经网络等深度学习算法&#xff0c;是目前的通用性算…

专题六_模拟_算法详细总结

目录 模拟算法 1.模拟算法流程&#xff08;一定要在草稿纸上演算一遍流程&#xff09; 2.把流程转换成代码 1. 替换所有的问号&#xff08;easy&#xff09; 解析&#xff1a; 1.暴力&#xff1a; 2.优化&#xff1a;&#xff08;找规律&#xff09; 总结&#xff1a; …

MySQL数据库迁移与备份实录

这里写目录标题 事情起因的概述查看磁盘空间使用情况为了进一步的明确宕机原因&#xff0c;查看MySQL日志信息进一步排查 如何针对磁盘空间不足进行挂载区域的修改以及数据的迁移与备份分析与梳理如何修改MySQL数据卷的挂载位置停止MySQL服务备份 MySQL 配置文件迁移 MySQL 数据…

MTK zephyr平台:USB升级、枚举流程

一、USB升级流程 通过代码及log分析,当前平台升级过程在PL阶段进行 USB download相关代码 mtk/modules/hal/boot/preloader/platform/flashc/ mtk/modules/hal/boot/preloader/platform/board_name/flash/ mtk/modules/hal/boot/preloader/platform/board_name/src/drive…

【Python报错已解决】ModuleNotFoundError: No module named ‘paddle‘

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

开放标准如何破解企业数字化与可持续发展的困境:The Open Group引领生态系统架构创新

应对数字化与可持续发展的双重挑战&#xff0c;开放标准是关键 在当今快速变化的商业环境中&#xff0c;企业不仅需要通过数字化转型提升竞争力&#xff0c;还面临日益严格的可持续发展要求。开放标准正在成为企业破解这一双重挑战的核心工具。The Open Group 2024生态系统架构…

智能BI项目第四期

开发图表管理功能 规划思路 首先需要做一个列表页。后端已经在星球提供了一个基础的万能项目模板&#xff0c;包含增删改查接口&#xff0c;我们只需要在此基础上进行定制化开发即可。所以本期后端的开发量不多&#xff0c;只需要复用即可&#xff0c;主要是前端。 规划功能…

【IPV6从入门到起飞】5-4 IPV6+Home Assistant(ESP32+MQTT+ILI9488)远程留言墙

IPV6Home Assistant[ESP32MQTTILI9488]远程留言墙 1 背景2 Home Assistant 配置2-1 配置 yaml2-2 效果 3 ESP32 配置3-1 使用 TFF_eSPI 库3-2 修改默认的SPI屏幕配置文件3-3 接线3-4 ESP32 工程代码 4 测试4-1 留言板设置内容4-2 ESP32 屏幕显示 5 后记 1 背景 在前面我们的几…

自动驾驶中的决策规划技术分享--轻舟智航

文章目录 0.概述&#xff1a;1 导航模块2 决策模块2.1 车道决策2.2 障碍物决策 3 轨迹规划3.1 时空分离规划3.2 时空联合规划 4 对比 0.概述&#xff1a; 李仁杰&#xff0c;轻舟智航规划算法负责人&#xff0c;自动驾驶决策与规划技术专家。 在自动驾驶系统中&#xff0c;决策…

Win10 录屏秘籍大公开:从新手到高手的进阶之路

之前因为某些原因不方便到客户那里进行软件培训&#xff0c;我们就发现录屏讲解供客户随时查看的方式好像更有效果。这次我就介绍一些能够实现win10怎么录屏操作的工具讲解。 1.福昕录屏大师 链接&#xff1a;www.foxitsoftware.cn/REC/ 这个工具是一款专业的电脑录屏软件&a…

SVN泄露 CTFHUB 解题笔记

参考大佬链接CTFHub | SVN泄露_ctfhubsvn泄露-CSDN博客 先下载插件 然后把GIT&#xff1b;里面的代码 乱盘上去 python2 不知道需不需要 先装了 再说。。。我的是裸机~ 开始作妖模式 Ubuntu 22.10 | Installati.one 上面一行的代码 链接 下面 插件 GITHUB页面下面的代码 d…

企业网络安全关键:防御措施和应急响应

感谢浪浪云支持发布 浪浪云活动链接 &#xff1a;https://langlangy.cn/?i8afa52 文章目录 什么是网络安全常见的网络安全威胁病毒和恶意软件网络钓鱼拒绝服务攻击中间人攻击社会工程学 基本的网络安全措施强密码策略双因素认证安装和更新防病毒软件定期备份 高级的网络安全方…

Java-面向对象编程(基础部分)

类和对象的区别和联系 类&#xff1a;类是封装对象的属性和行为的载体&#xff0c;在Java语言中对象的属性以成员变量的形式存在&#xff0c;而对象的方法以成员方法的形式存在。 对象&#xff1a;Java是面向对象的程序设计语言&#xff0c;对象是由类抽象出来的&#xff0c;…

使用 MobaXterm 远程连接 Linux 虚拟机并实现文件传输

文章目录 前言一、什么是 MobaXterm二 、MobaXterm 安装三、使用 MobaXterm 远程连接 Linux 虚拟机1. 准备工作2. 创建 SSH 连接3. 登录虚拟机 四、使用 MobaXterm 进行文件传输总结 前言 在日常开发和运维中&#xff0c;Windows 用户经常需要通过远程连接到 Linux 服务器进行…

链式栈讲解

文章目录 &#x1f34a;自我介绍&#x1f34a;链式栈入栈和出栈linkstack.hlinkstack.c 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34a;自我介绍 Hello,大家好&#xff0c;我是小珑也要…

UBUNTU20.04安装CH384串口卡驱动

继续上文&#xff1a;统信UOS安装CH384串口卡驱动-CSDN博客 统信UOS系统成功安装CH384串口驱动后&#xff0c;继续在ubuntu20.04下安装驱动&#xff0c;发现一直报错&#xff0c;原因是内核驱动不一致。 解决办法&#xff1a; 1. 下载最新的驱动。CH35XCH384驱动源文件资源-C…

【WPF】02 按钮控件圆角配置及状态切换

按钮圆角 先从工具箱里拖进来一个Button控件&#xff0c;然后对这个按钮进行美化。 首先在 xaml 里按钮控件部分 添加如下代码&#xff1a; <Button x:Name"btnLogin" Content"登录" HorizontalAlignment"Center" Margin"0,399,0,0&q…