【Spring Boot相关】关于OpenAPI,Swagger,SpringFox,springdoc-openapi区别以及示例演示

【本文内容】

  • OpenAPI vs Swagger:
    • OpenAPI是规范
    • Swagger是规范的实现之一。
  • Swagger vs Springfox:
    • Swagger致力于API相关的设计、构建、展示,包括支持OpenAPI,但还支持其它如AsyncAPI,Json Schema等等,模块众多,语言也不仅限于Java。
    • Springfox致力于Java Spring相关的文档维护,但目前对于Spring Boot高版本(比如2.7.0)的支持并不是很好。
  • springdoc-openapi --> 【推荐使用】
    • 是Spring官方推出的OpenAPI规范的实现之一,可与swagger ui集成。

1. OpenAPI vs Swagger

  • OpenAPI:是规范
  • Swagger:规范的实现之一

Open API Initiative (OAI)发布的OpenAPI 3.0.0规范:https://www.openapis.org/blog/2017/07/26/the-oai-announces-the-openapi-specification-3-0-0

在OpenAPI 3.0.0规范的GitHub:https://github.com/OAI/OpenAPI-Specification/blob/main/README.md下,可以看到:

  • 目前最新的规范版本为3.1.0,具体看这里
  • 在详情页链接:implementations,列举了一些OpenAPI 3.0规范的实现,有各种语言的,如Go,Java,Node.js等等。

其中对于OpenAPI 3.0规范的实现,Java相关的有:

  1. swagger-parser
    Swagger的一个独立项目,用Java语言来转换OpenAPI的定义。
    GitHub地址:https://github.com/swagger-api/swagger-parser
    其中:

    • 版本1.X支持OpenAPI 2.0,
    • 版本2.1.0支持OpenAPI 3.1
  2. swagger-models
    基于OpenAPI 3.0的java实现,在swagger-core项目中。
    GitHub地址:https://github.com/swagger-api/swagger-core/tree/master/modules/swagger-models
    其中:

  • Swagger Core 1.5.x支持OpenAPI 2.0
  • Swagger Core 2.x支持OpenAPI 3.x
  1. springdoc-openapi【推荐使用,Demo详见第3章】
    Spring官方的基于OpenAPI 3.0.0的实现,支持Spring Boot 1.0+ 和2.0+版本。同时也支持Swagger-ui。
    如果Spring Boot版本是3.0+,需要使用springdoc-openapi v2.0版本。
    GitHub地址:https://github.com/springdoc/springdoc-openapi

  2. spring-openapi
    支持Java Spring,并支持Jackson相关的注解以及可以自定义拦截器。
    GitHub地址:https://github.com/jrcodeza/spring-openapi

2. Swagger vs Springfox

2.1 Swagger

官网:https://swagger.io/
Swagger主要是服务REST APIs的设计、文档、测试,包括一系列的开源产品。截图来自官网:

image.png

除了以上三个模块,Swagger还有很多很多其它子项目,如SwaggerHub插件Swagger-JS, Swagger-Parser, Swagger-Node等等。由此可见,Swagger项目并不局限于Java语言,它的目标是更好的设计、管理API,包括OpenAPI规范, AsyncAPI规范, JSON相关的Schema等等。

2.2 SpringFox

GitHub:https://github.com/springfox/springfox
官方文档:http://springfox.github.io/springfox/docs/current/

Springfox是Java的类库,可以自动为Spring框架生成JSON APIs的文档,并支持swagger, RAML, jsonapi等。主要的目标提为了更好的支持Spring相关的技术(包含Spring MVC)。

Hello World例子参考:https://www.baeldung.com/swagger-2-documentation-for-spring-rest-api

2.2.1 引入依赖
注:目前springfox对于Spring Boot的版本支持比较落后,比如3.0.0版本是他们唯一的release版本,能支持Spring Boot 2.2及以上版本。对于2.2以下的版本,不能使用springfox-boot-starter,而是需要手动引入springfox-swagger2以及springfox-swagger-ui

但是springfox-boot-starter 3.0.0版本对于高版本的Spring Boot也并不能很好的支持,比如Spring Boot 2.7.0就不能和springfox-boot-starter兼容。

对于高版本的Spring Boot,推荐使用springdoc-openapi。

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

本示例用的是Spring Boot 2.4.0版本。

2.2.2 加入配置

@Configuration
public class SpringFoxConfig {
    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.any())
                .build();
    }
}

【测试】
首先需要写一个UserController用来测试。
其次打开浏览器地址:http://localhost:8080/swagger-ui/

image.png

3. 推荐使用springdoc-openapi

在第1章OpenAPI的implementations第3个,即springdoc-openapi,就有介绍到springdoc-openapi是Spring官方推出的基于OpenAPI 3.0.0的实现。

从官方示例来看,支持的case很多:
image.png

Hello World例子参考:https://www.baeldung.com/spring-rest-openapi-documentation

3.1 引入依赖
        <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-ui</artifactId>
            <version>1.6.4</version>
        </dependency>
3.2 swagger-ui配置信息

默认swagger-ui的地址为/swagger-ui.html,也可在application.properties文件中修改,更多关于swagger-ui的配置,参考:https://springdoc.org/#swagger-ui-properties

springdoc.swagger-ui.path=/swagger-ui-custom.html

默认情况下swagger-ui是开着的,也可通过配置进行关闭:springdoc.swagger-ui.enabled=false

【测试】
和#2.2中的demo一样,需要写一个UserController用来测试。打开浏览器地址:http://localhost:8080/swagger-ui-custom.html

image.png

3.3 springdoc-openapi core配置信息

详细参考:https://springdoc.org/#properties
默认的路径为/v3/api-docs,可以修改:

springdoc.api-docs.path=/v3/api-docs/custom

默认spring-doc-openapi相关的信息也是开着的,可以通过修改配置进行关闭:springdoc.api-docs.enabled=false

【测试】
打开浏览器:http://localhost:8080/v3/api-docs/custom,如下:

image.png

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容