SpringBoot3 + OpenAPI3规范 快速整合

一、前言

相信大家在工作中都接触过 API 文档,市面上能生成和管理文档的工具有很多,比如 PostManApiPostApiFox等等,当我们需要进行临时调试的时候实用工具确实很方便,但是实际开发项目中,集中管理API文档则需要额外的人力去维护,所以 swagger 诞生了,其实 swagger 本质是一种描述接口 API 的规范, 目的是推动 API 的标准化 ,起初的版本为 swagger2, 2015 年,Swagger 规范由 Swagger 项目 捐赠给 Linux 基金会,并创建了 OpenAPI Initiative(OAI)。 Swagger 规范 被重命名为 OpenAPI 规范,而 Swagger 作为工具集的名称保留下来继续使用。因此,Swagger 2.0 规范的继承者就是 OpenAPI 3.0

OpenAPI 3.0 是对 Swagger 2.0 的重大更新,规范的名称也从 Swagger 改为 OpenAPI。它在 Swagger 2.0 的基础上引入了许多改进和新的功能。 也有人称其为 Swagger3

默认整合的接口文档页面比较简陋,我们选择第三方框架,对其做了一些增强扩展,UI 更符合使用习惯。

Knife4j 官方文档地址:https://doc.xiaominfo.com/

swagger 官方文档地址:https://swagger.io/docs/

springdoc-openapi 官方文档地址:https://springdoc.org/

springfox 3.0.0 官方整合案例参考(不建议使用,没找到详细文档,并且好久不维护了):http://springfox.github.io/springfox/

二、快速开始

注意:

  • Spring Boot 3 只支持OpenAPI3规范
  • Knife4j提供的starter已经引用springdoc-openapi的jar,开发者需注意避免jar包冲突
  • JDK版本必须 >= 17

引入依赖

我们使用当前最新版本为 4.5.0

<properties>
    <knife4j.version>4.5.0</knife4j.version> <!-- knife4j 接口文档 -->
</properties>

<!-- knife4j swagger3 接口文档 -->
<dependencies>
  <dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
    <version>${knife4j.version}</version>
  </dependency>
</dependencies>

修改配置文件

# springdoc-openapi项目配置
springdoc:
  swagger-ui:
    path: /swagger-ui.html
    tags-sorter: alpha
    operations-sorter: alpha
  api-docs:
    path: /v3/api-docs
  group-configs:
    - group: 'default'
      paths-to-match: '/**'
      packages-to-scan: com.yang.itshare.controller # 扫描接口所在的包
# knife4j的增强配置,不需要增强可以不配
knife4j:
  enable: true
  setting:
    language: zh_cn

使用 OpenAPI3 的规范注解,注释各个接口,以下是示例代码,包含了常用的注解,可以参照修改

@RestController
@RequestMapping("body")
@Tag(name = "body参数")
public class BodyController {

    @Operation(summary = "普通body请求")
    @PostMapping("/body")
    public ResponseEntity<FileResp> body(@RequestBody FileResp fileResp){
        return ResponseEntity.ok(fileResp);
    }

    @Operation(summary = "普通body请求+Param+Header+Path")
    @Parameters({
        @Parameter(name = "id",description = "文件id",in = ParameterIn.PATH),
        @Parameter(name = "token",description = "请求token",required = true,in = ParameterIn.HEADER),
        @Parameter(name = "name",description = "文件名称",required = true,in=ParameterIn.QUERY)
    })
    @PostMapping("/bodyParamHeaderPath/{id}")
    public ResponseEntity<FileResp> bodyParamHeaderPath(@PathVariable("id") String id,@RequestHeader("token") String token, @RequestParam("name")String name,@RequestBody FileResp fileResp){
        fileResp.setName(fileResp.getName()+",receiveName:"+name+",token:"+token+",pathID:"+id);
        return ResponseEntity.ok(fileResp);
    }
}

最后,访问Knife4j的文档地址:http://ip:port/doc.html 即可查看文档

三、定制化需求

可以看到,文档的一些基础信息,我们并没有指定,使用的都是默认的,当然这些对应接口的使用并不重要,但是为了规范,我们最好还是配置一下。

knife4j 只是对于 springdoc-openapi 做了一些增强,所有配置可以参考原项目说明 https://springdoc.org/#properties

增强配置:https://doc.xiaominfo.com/docs/features/enhance

我这里只列出基础的配置:

# knife4j的增强配置,不需要增强可以不配
knife4j:
  # 开启增强配置
  enable: true
  # 开启生产环境屏蔽
  production: false
  setting:
    language: zh_cn
    swagger-model-name: 实体类列表
    enable-version: true # 是否开启界面中对某接口的版本控制,如果开启,后端变化后Ui界面会存在小蓝点
    enable-host-text: 127.0.0.1:8080
    enable-footer-custom: true
    footer-custom-content: Apache License 2.0 | Copyright  2024-[itshare](https://www.csyblog.cn)

然后是作者信息,版本信息,这个没有找到具体的 yaml 配置项,但是可以通过 bean 的方式注入一个配置对象。

参考文档:https://springdoc.org/#migrating-from-springdoc-v1

@Configuration
public class SwaggerConfig {

    @Bean
    public GroupedOpenApi publicApi() {
        // 建造者模式构建Docket
        return GroupedOpenApi.builder()
        .addOpenApiCustomizer(openApi -> openApi.setInfo(apiInfo()))
        .group("ITSHARE")
        // 需要放出的接口
        .packagesToScan("com.yang.itshare.controller")
        .build();
    }

    private Info apiInfo() {
        return new Info()
        .title("接口文档")
        .description("ITSHARE API描述")
        .contact(new Contact().url("https://www.csyblog.cn").name("申阳").email("2417254000@qq.com"))
        .license(new License().name("Apache License 2.0").identifier("Apache 2.0").url("https://www.apache.org/licenses/LICENSE-2.0"))
        .version("v1.0");
    }

四、总结

基本整合已经完成,我们还可以配置鉴权等高级特性,这里我暂时用不着,就不深入研究了,如果感兴趣可以在上面提到的官方文档中自行查找。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曹申阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值