Swagger3/2+Spring boot 使用小结

一:前言

  Swagger 是一个 RESTful API 的开源框架,它的主要目的是帮助开发者设计、构建、文档化和测试 Web API。Swagger 的核心思想是通过定义和描述 API 的规范、结构和交互方式,以提高 API 的可读性、可靠性和易用性,同时降低 API 开发的难度和开发者之间的沟通成本。

 

1:Swagger发展史

复制代码

Swagger它最初由Tony Tam在2011年创建,并在之后被SmartBear Software公司收购。在过去几年中,Swagger经历了许多重大的更新和变化,
其发展史大概可以分为以下几个阶段:
    ①:Swagger 1.x 阶段(2011-2014年)
        Swagger最初是一个简单的API文档生成工具,通过对JAX-RS和Jersey注解的支持自动生成API文档,使得API文档的维护变得更加容易。
        在这个阶段,Swagger还没有完全成熟,只能支持基本的API描述和文档生成。
    ②:Swagger 2.x 阶段(2014-2017年)
        在Swagger 2.x阶段,Swagger发生了重大变化。它不再仅仅是一个文档生成工具,而是一个完整的API开发和管理平台。Swagger 2.x加
        入了强大的注解支持,可以描述API的细节信息,如请求参数、返回类型等,以及定义RESTful API的元数据,如API描述、标签等。
        此外,Swagger 2.x还引入了OpenAPI规范,在API定义方面有了更严格的标准和规则。
    ③:OpenAPI 阶段(2017-至今)(也被称为Swagger 3.x)
    在2017年,Swagger 2.x的规范成为了Linux基金会旗下的OpenAPI规范。这标志着Swagger从一款工具演变成为了一个开放且标准的API
    定义框架。OpenAPI规范不仅继承了Swagger 2.x的特性,还提供了更加全面和严格的API定义规范,并且扩展了对非RESTful API的支持
    随着OpenAPI规范的普及,越来越多的API开发者开始使用Swagger/OpenAPI来开发、测试和文档化他们的RESTful API。
    所以,随着Linux基金会旗下的OpenAPI收购了Swagger2.x后对其进行了更严格的规范,又进行了各种优化,
    所以我们也可以称OpenAPI是一个全新的Swagger3.x,因为OpenAPI对其作了更多的优化和规范。
除了上述几个主要阶段之外,还有一些其他重要的事件和版本,如Swagger UI、Swagger Codegen、SwaggerHub等等。
这些工具和服务进一步扩展了Swagger的功能,使其成为了一个更加完整、强大和易于使用的API定义和管理平台。

2:Swagger其它介绍

  其实OpenAPI规范(也称为 Swagger 3.x 规范)是一种用于描述RESTful API的标准化格式,它定义了如何描述API的基本信息、结构、参数、响应等方面的规范。OpenAPI规范以机器可读的方式定义了RESTful API的结构和特征,支持自动生成文档、客户端与服务端代码、Mock Server和测试工具等。

  OpenAPI规范最初由开发Swagger的团队在2010年推出,从Swagger 2.0开始,Swagger规范被正式更名为OpenAPI规范,并得到了许多社区的支持和贡献。OpenAPI规范采用JSON或YAML格式编写,并支持多种数据类型,可以描述API的基本信息、路径、HTTP方法、参数、响应等各种细节。通过遵循OpenAPI规范,开发者可以快速定义和构建RESTful API,并且可以生成相应的文档和代码来帮助他们更快地开发与测试API。同时,OpenAPI规范还可以促进不同系统之间的交互和集成,因为根据规范定义的API可以被多个客户端程序和服务端程序所理解和使用。

  OpenAPI阶段的Swagger也被称为Swagger 3.0。在Swagger 2.0后,Swagger规范正式更名为OpenAPI规范,并且根据OpenAPI规范的版本号进行了更新。因此,Swagger 3.0对应的就是OpenAPI 3.0版本,它是Swagger在OpenAPI阶段推出的一个重要版本。与前几个版本相比,Swagger 3.0更加强调对RESTful API的支持和规范化,提供了更丰富和灵活的定义方式,并且可以用于自动生成文档、客户端代码、服务器代码和测试工具等。

3:SpringFox工具

  Springfox是一套可以帮助Java开发者自动生成API文档的工具,它是基于Swagger 2.x基础上开发的。Swagger已经成为了RESTful API文档生态系统的事实标准,而Springfox是一个用于集成Swagger2.x到Spring应用程序中的库。而且Springfox提供了一些注解来描述API接口、参数和返回值,并根据这些信息生成Swagger UI界面,从而方便其他开发人员查看和使用您的API接口。此外,Springfox还支持自动生成API文档和代码片段,简化了开发人员的工作量。除了集成Swagger 2.x,Springfox还提供了一些额外功能,例如自定义Swagger文档、API版本控制、请求验证等等。这些功能使得Springfox可以胜任各种类型和规模的应用程序,同时还可以提高代码质量和开发效率。总之,Springfox是一个非常有用的工具,它可以帮助Java开发者快速、简单地集成Swagger2.x,并为他们的应用程序生成高质量的API文档。无论您开发的是大型企业应用程序还是小型服务,使用Springfox都能够提高团队的生产力和代码质量。

注意:但是随着时间的推移,Swagger2.x终究成为历史,所以我们可以看出springfox-boot-starter的坐标从3.0.0版本(2020年7月14日)开始就一直没有更新;也得注意的是springfox-swagger2坐标和springfox-boot-start是一样的,但springfox-boot-start只有3.0.0版本。这里我就不在使用Swagger2.x版本,具体可以在网上找到许多,因为大部分的网上资料都是Swagger2.x的方式。

4:SpringDoc工具(推荐)

  SpringDoc对应坐标是springdoc-openapi-ui,它是一个集成Swagger UI和ReDoc的接口文档生成工具,在使用上与springfox-boot-starter类似,但提供了更为灵活、功能更加强大的工具。其中除了可以生成Swagger UI风格的接口文档,还提供了ReDoc的文档渲染方式,可以自动注入OpenAPI规范的JSON描述文件,支持OAuth2、JWT等认证机制,并且支持全新的OpenAPI 3.0规范

  SpringDoc是基于OpenAPI 3.0规范构建的,因此推荐在Spring Boot 2.4及以上版本中使用springdoc-openapi-ui库来集成Swagger3.x。在这些版本中,springdoc-openapi-ui库已被广泛应用,并且得到了社区的大力支持和推广。而在Spring Boot 2.3及其以下版本,可以使用springfox-boot-starter库来集成Swagger2.x。

  SpringDoc是有着更加先进的技术架构和更好的扩展性,使得其逐渐取代了springfox-boot-starter工具包,成为了当前Spring Boot生态中最受欢迎的API文档工具之一。同时springdoc-openapi-ui还拥有更为完善的开发文档和社区支持,从而吸引了越来越多的开发者加入到这个项目中。因此作为一个Spring Boot开发者,如果想要快速、方便地生成符合OpenAPI 3.0规范的接口文档,建议使用springdoc-openapi-ui这个优秀的工具。

二:SpringBoot集成Open API 3.0(Swagger3.0)

  我们在SpringBoot中想集成Swagger3.0,一般不选择原生的Maven坐标,而是选择 springdoc-openapi-ui的Maven坐标,它可以很好的和Spring或SpringBoot项目集成;这个坐标也被Spring社区广泛支持和认可,并被认为是集成Swagger UI和OpenAPI规范的一个优秀选择。下面将直接介绍使用。

总的来说,Swagger 按照其规范,可以很方便的实现api的单元测试..下面简单记录下swagger2和3使用上的差异

swagger3

1添加依赖(只需要一个,更加方便了)

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>

2添加配置 application.yml

springfox:
  documentation:
    enabled: true

#swagger-ui 默认是启用的,无需配置

3添加配置类

@Configuration
@EnableOpenApi
@EnableWebMvc
public class SwaggerConfig {
    @Bean
    public Docket api() {
        return new Docket(DocumentationType.OAS_30)
                .select()

//也可以扫描包路径
                .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
                .paths(PathSelectors.any())
                .build()
                .securitySchemes(Arrays.asList(new ApiKey("Bearer", "Authorization", "header")))
                .securityContexts(Collections.singletonList(
                        SecurityContext.builder()
                                .securityReferences(Collections.singletonList(
                                        new SecurityReference("Bearer", new AuthorizationScope[0])
                                ))
                                .build()
                ))
                .apiInfo(apiInfo());
    }


    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("接口文档")
                .description("接口文档")
                .version("1.0.0")
                .build();
    }
}

访问路径:

http://127.0.0.1:10050/swagger-ui/index.html


swagger2

1 添加依赖

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.6.1</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.6.1</version>
</dependency>

2 添加配置
@Configuration
@EnableSwagger2
public class Swagger2 {
    @Bean
    public Docket createRestApi() {
        /**
         * 追加header参数
         */
        List<Parameter> parameters = new ArrayList<Parameter>();
        ParameterBuilder parameterBuilder = new ParameterBuilder();
        parameterBuilder.name("token").description("令牌").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
        parameters.add(parameterBuilder.build());
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
                .paths(PathSelectors.any())
                .build()
                .globalOperationParameters(parameters)
                .apiInfo(info());
    }

    private ApiInfo info() {
        return new ApiInfoBuilder()
                .title("api[baisu-api]在线文档")
                .description("Restful")
                .version("1.0.0")
                .build();
    }
}

访问路径:

http://127.0.0.1:10050/swagger-ui.html

最后使用地方一样,不需要改动
    

@EnableAutoConfiguration
@RestController
@RequestMapping("/public/mall/category")
@Api(tags = "类目表")
public class MallCategoryPublicEndpoint {

    @javax.annotation.Resource
    private org.xt.shisui.mall.MallCategoryApiService mallCategoryApiService;


    @ApiOperation(value = "查询", notes = "根据url中的id获取对象信息")
    @RequestMapping(value = "/get", method = RequestMethod.POST)
    public Response<MallCategoryGetResp> get(@RequestBody MallCategoryGetReq req, final HttpServletRequest request) throws SimpleException {
        return mallCategoryApiService.get(req);
    }
...

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RIP,EIGRP,OSPF的区别

1.路由协议 能否选择出最优路径 2.路由协议 是否能够完成故障切换/多久能够完成故障切换 3.路由协议 是否会占用过大硬件资源 -- RIP -- 路由信息协议 跳数:一次三层设备的转发算一跳 中间隔的设备数量 不按照链路带宽来算 Rip认为路径一样,这个时候。 下面这个跳数不…

[NCTF2019]SQLi ---不会编程的崽

欸嘿&#xff0c;继续sql注入。又是新的sql注入类型 很直接哦&#xff0c;给出了sql查询语句。简单扫描一下&#xff0c;robots.txt还能访问。里边提示hint.txt $black_list "/limit|by|substr|mid|,|admin|benchmark|like|or|char|union|substring|select|greatest|%00…

Neo4j桌面版导入CVS文件

之后会出来一个提示框&#xff0c;而且会跳出相关文件夹&#xff1a; 然后我们将CSV文件放在此目录下&#xff1a; 我们的relation.csv是这样的 参见&#xff1a; NEO4J的基本使用以及桌面版NEO4J Desktop导入CSV文件_neo4j desktop使用-CSDN博客

[BT]BUUCTF刷题第4天(3.22)

第4天&#xff08;共3题&#xff09; Web [极客大挑战 2019]Upload 这是文件上传的题目&#xff0c;有一篇比较详细的有关文件上传的绕过方法文件上传漏洞详解&#xff08;CTF篇&#xff09; 首先直接上传带一句话木马的php文件&#xff0c;发现被拦截&#xff0c;提示不是图…

HTTP(2)

HTTP 通信过程包括从客户端发往服务器端的请求及从服务器端返回客户端的响应。 那么请求和响应是怎样运作的呢 HTTP 报文 用于 HTTP 协议交互的信息被称为 HTTP 报文。 请求端&#xff08;客户端&#xff09;的HTTP 报文叫做请求报文&#xff0c;响应端&#xff08;服务器…

BUUCTF-Misc12

[BJDCTF2020]纳尼1 1.打开附件 一张打不开的图片和一个没什么用的文本文档 2.010 Editor 用010 Editor 打开6.gif这个文件 发现文件头缺少 .gif 的文件头是47 49 46 38 添加文件头并保存 得到一个动图&#xff0c;由四张图片组成 得到一串看似像base64的编码&#xff1a;Q…

第六届“传智杯”决赛 流水账 | 珂学家

前言 整体评价 有幸参加了第六届的传智杯决赛(A组)&#xff0c;因为这个比赛是牛客协办&#xff0c;所以就写在这里。 作为Java选手&#xff0c;比赛中其实吃亏了&#xff0c;主要是T2吃了一发TLE&#xff0c;T4吃了一发莫名其妙的MLE。 顺便吐槽下T3&#xff0c;自测反馈WA…

鸿蒙ArkUI【开发移植Carbon】

项目介绍 本项目是基于开源项目[Carbon] 进行harmonyos化的移植和开发的。 移植版本&#xff1a;Branches/master 这不是单纯只是API和基本功能展示demo&#xff0c;它是最有用的自定义控件的实现&#xff0c;如设计规范中所示。 Carbon试图&#xff1a; 让事情变得更简单&…

手把手教你如何下载学浪上已购买的视频课程

全程干货,教大家如何下载学浪上已购买的视频课程 这个软件已经集成了学浪下载课程的功能 使用也特别简单 链接&#xff1a;https://pan.baidu.com/s/1y7vcqILToULrYApxfEzj_Q?pwdkqvj 提取码&#xff1a;kqvj --来自百度网盘超级会员V10的分享 详细操作按照图片流程 一、…

DP:路径规划模型

创作不易&#xff0c;感谢三连支持&#xff01; 路径规划主要是让目标对象在规定范围内的区域内找到一条从起点到终点的无碰撞安全路径。大多需要用二维dp数组去实现 一、不同路径 . - 力扣&#xff08;LeetCode&#xff09;不同路径 class Solution { public:int uniquePath…

10一维数组

一维数组是什么&#xff1f; // 相同的数据类型的元素组成的有序集合 // 创建一个一维数组 // 例如&#xff1a; int a[5]{1,2,3,4,5}; //说明&#xff1a; // int:表示数据类型 // a:表示数组名 // [5]&#xff1a;数组的长度 // {1,2,3,4,5} &#xff1a;数组的元素 // 一…

Photoshop 工具使用详解(全集 · 2024版)

全面介绍 Photoshop 工具箱里的工具&#xff0c;点击下列表格中工具名称或图示&#xff0c;即可查阅工具的使用详解。 移动工具Move Tool移动选区、图层和参考线。画板工具Artboard Tool创建、移动多个画布或调整其大小。moVe快捷键&#xff1a;V 矩形选框工具 Rectangular Mar…

视频素材库有哪些网站?6大高质量素材网告诉您

真正的创作始于灵感的火花&#xff0c;而优秀的素材则是让这火花燎原的燃料。在视频创作的广阔天地里&#xff0c;每一帧画面、每一个音符、每一段动画都承载着讲述故事的力量。以下精选的素材网站&#xff0c;无论是为了增添你视频的视觉震撼力&#xff0c;还是为了丰富故事的…

sql注入五-WEB攻防-注入工具SQLMAPTamper编写指纹修改高权限操作目录架构

演示案例&#xff1a; 数据猜解-库表列数据&字典权限操作-文件&命令&交互式提交方法-POST&HEAD&JSON绕过模块-Tamper脚本-使用&开发分析拓展-代理&调试&指纹&风险&等级 #参考&#xff1a; https://www.cnblogs.com/bmjoker/p/9326258.…

状态机高阶讲解-10

1896 01:19:16,700 --> 01:19:19,550 那接下来我们就开始来建模了 1897 01:19:20,690 --> 01:19:22,163 那建模的开始呢 1898 01:19:22,163 --> 01:19:24,900 我们就首先要添加一个类了 1899 01:19:26,330 --> 01:19:27,868 那我们这个很简单 1900 01:19:27,86…

主干网络篇 | YOLOv8更换主干网络之GhostNet

前言:Hello大家好,我是小哥谈。GhostNet是2019年由华为诺亚方舟实验室发布的轻量级网络,速度和MobileNetV3相似,但是识别的准确率比MobileNetV3高,在ImageNet ILSVRC2012分类数据集的达到了75.7%的top-1精度。该论文提除了Ghost模块,通过廉价操作生成更多的特征图。基于一…

【go从入门到精通】for循环控制

作者简介&#xff1a; 高科&#xff0c;先后在 IBM PlatformComputing从事网格计算&#xff0c;淘米网&#xff0c;网易从事游戏服务器开发&#xff0c;拥有丰富的C&#xff0c;go等语言开发经验&#xff0c;mysql&#xff0c;mongo&#xff0c;redis等数据库&#xff0c;设计模…

结构体与共用体

1概述 迄今为止&#xff0c;已介绍了基本类型(或称简单类型)的变量(如整型、实型、字符型变量等)。也介绍了一种构造类型数据一-数组&#xff0c;数组中的各元素是属于同一个类型的。 但是只有这些数据类型是不够的。有时需要将不同类型的数据组合成一个有机的整体,以便于引用…

20231911 2022-2023-2 《网络攻防实践》实验三

1.实验内容 1、实践tcpdump 使用tcpdump开源软件对在本机上访问www.tianya.cn网站过程进行嗅探&#xff0c;回答问题&#xff1a;你在访问www.tianya.cn网站首页时&#xff0c;浏览器将访问多少个Web服务器&#xff1f;他们的IP地址都是什么&#xff1f; 2、实践Wireshark 使…

使用Intellij idea编写Spark应用程序(Scala+SBT)

使用Intellij idea编写Spark应用程序(ScalaSBT) 对Scala代码进行打包编译时&#xff0c;可以采用Maven&#xff0c;也可以采用SBT&#xff0c;相对而言&#xff0c;业界更多使用SBT。 运行环境 Ubuntu 16.04 Spark 2.1.0 Intellij Idea (Version 2017.1) 安装Scala插件 安…