Swagger的介绍与使用(二)

news2024/11/14 13:31:39

一. 介绍( Spring Boot + JDK 17 + Swagger 3(OpenAPI)结合使用)

根据2024年当前环境来看, Spring Boot + JDK 17 + Swagger 3(OpenAPI)结合使用更加有趋势

将Spring Boot、JDK 17和Swagger 3(OpenAPI)结合使用,可以带来以下好处:

  • 快速开发:Spring Boot的自动配置和简化部署特性,结合JDK 17的新特性和改进,可以极大地提高开发效率。
  • API文档自动化:Swagger 3(OpenAPI)能够自动生成API文档,并提供可视化界面,使得API的调用和测试变得更加简单和直观。
  • 跨平台支持:Java的跨平台特性,结合Spring Boot的轻量级和独立运行能力,使得开发的应用可以轻松部署到各种环境中。
  • 标准化和可维护性:OpenAPI规范为RESTful API提供了一种标准化的描述方式,有助于提高API的可维护性和可扩展性。

二. 使用

1> 添加Maven依赖 

<!-- openAPI包,替换 Swagger 的 SpringFox -->
        <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
            <version>2.2.0</version>
        </dependency>

2> 添加application.yml配置文件

与application.properties相同,更加简洁

spring:
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher

3> 添加OpenAPIConfig,配置Swagger

package com.nianxi.srping_demo.config;

import io.swagger.v3.oas.models.ExternalDocumentation;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class OpenAPIConfig {
    @Bean
    public OpenAPI openAPI() {
        return new OpenAPI()
                .info(new Info()
                        .title("接口文档标题")
                        .description("SpringBoot3 集成 Swagger3接口文档")
                        .version("v1"))
                .externalDocs(new ExternalDocumentation()
                        .description("项目API文档")
                        .url("/"));
    }
}

4> 添加SwaggerController

package com.nianxi.srping_demo.controller;

import com.nianxi.srping_demo.model.SwaggerApiModel;
import io.swagger.v3.oas.annotations.Hidden;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.*;

@Tag(name = "控制器:测试Swagger3", description = "描述:测试Swagger3")
@RestController
public class SwaggerController {

    @Operation(summary = "测试Swagger3注解方法Get")
    @Parameters({@Parameter(name = "id",description = "编码"),
            @Parameter(name = "headerValue",description = "header传送内容")})
    @ApiResponses({
            @ApiResponse(responseCode = "200", description = "请求成功"),
            @ApiResponse(responseCode = "400", description = "请求参数没填好"),
            @ApiResponse(responseCode = "401", description = "没有权限"),
            @ApiResponse(responseCode = "403", description = "禁止访问"),
            @ApiResponse(responseCode = "404", description = "请求路径没有或页面跳转路径不对")
    })
    @GetMapping(value = "/swagger/student")
    public Object getStudent(@RequestParam @Parameter(example = "2")  String id,
                             @RequestHeader @Parameter(example = "2") String headerValue){
        return id;
    }

    @Operation(summary = "测试Swagger3注解方法Post")
    @ApiResponses({
            @ApiResponse(responseCode = "200", description = "请求成功"),
            @ApiResponse(responseCode = "400", description = "请求参数没填好"),
            @ApiResponse(responseCode = "401", description = "没有权限"),
            @ApiResponse(responseCode = "403", description = "禁止访问"),
            @ApiResponse(responseCode = "404", description = "请求路径没有或页面跳转路径不对")
    })
    @PostMapping(value = "/swagger/student", produces = "application/json")
    public SwaggerApiModel updateStudent(@RequestBody SwaggerApiModel model){
        return model;
    }


    /**
     * swagger 不暴漏该 api,通过@Hidden隐藏
     * 但是仍然可以访问
     * @return
     */
    @Hidden
    @GetMapping(value = "/swagger/hiddenApi")
    public String hiddenApi(){
        return "hiddenApi";
    }

    /**
     * swagger 暴漏该 api,没有配置@Hidden会展示
     * @return
     */
    @GetMapping(value = "/swagger/noHiddenApi")
    public String noHiddenApi(){
        return "noHiddenApi";
    }
}

5> 添加SwaggerModel实体

package com.nianxi.srping_demo.model;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import java.io.Serializable;

@Data
@Schema(description= "学生信息")
public class SwaggerApiModel implements Serializable {

    @Schema(description = "主键ID", required = true, example = "1")
    private Long id;//required表示是否必填

    @Schema(description = "手机号", required = true)
    private String phonenum;

    @Schema(description = "密码", required = true)
    private String password;

    @Schema(description = "年龄", required = true)
    private Integer age;

}

 5> 启动Application启动类进行测试

输入local:8080/swagger-ui/index.html

如果打开失败可以查看自己idea日志

 

端口号要一致

三. 注解分析

1. 基本信息注解

@OpenAPIDefinition
  • 描述:用于定义整个 API 文档的基本信息。
  • 可用于:类、接口。
  • 属性:
    • info:指定 @Info 注解的对象,用于描述 API 文档的基本信息。
@Info
  • 描述:用于定义 API 文档的基本信息。
  • 可用于:类、接口。
  • 属性:
    • title:API 的标题。
    • description:API 的描述。
    • version:API 的版本号。
    • termsOfService:服务条款的 URL。
    • contact:指定 @Contact 注解的对象,用于描述联系人信息。
    • license:指定 @License 注解的对象,用于描述许可证信息。
@Contact
  • 描述:用于定义 API 文档中的联系人信息。
  • 可用于:类、接口。
  • 属性:
    • name:联系人的名称。
    • url:联系人的网址。
    • email:联系人的电子邮件地址。
@License
  • 描述:用于定义 API 文档中的许可证信息。
  • 可用于:类、接口。
  • 属性:
    • name:许可证的名称。
    • url:许可证的网址。

2. 分组注解

@Tag
  • 描述:用于给 API 分组,用途类似于为 API 文档添加标签。
  • 可用于:方法、类、接口。
  • 属性:
    • name:分组的名称。

3. 请求方法注解

以下注解用于描述 API 的请求方法:

@Operation
  • 描述:用于描述 API 的操作。
  • 可用于:方法。
  • 属性:
    • summary:操作的摘要信息。
    • description:操作的详细描述。
    • tags:指定 @Tag 注解的对象数组,用于将操作归类到特定的分组。
    • parameters:指定 @Parameter 注解的对象数组,用于描述操作的输入参数。
    • responses:指定 @ApiResponse 注解的对象数组,用于描述操作的响应结果。
    • requestBody:指定 @RequestBody 注解的对象,用于描述操作的请求体。
@Parameter
  • 描述:用于描述操作的输入参数。

  • 可用于:方法。

  • 属性:

    • name:参数的名称。
    • in:参数的位置,可以是 pathqueryheadercookie 中的一种。
    • description:参数的描述。
    • required:参数是否必需,默认为 false
  • schema:指定 @Schema 注解的对象,用于描述参数的数据类型。

@RequestBody
  • 描述:用于描述操作的请求体。
  • 可用于:方法。
  • 属性:
    • required:请求体是否必需,默认为 false
    • content:指定 @Content 注解的对象数组,用于描述请求体的内容。
@ApiResponse
  • 描述:用于描述操作的响应结果。
  • 可用于:方法。
  • 属性:
    • responseCode:响应的状态码。
    • description:响应的描述。
    • content:指定 @Content 注解的对象数组,用于描述响应的内容。
@Content
  • 描述:用于描述请求体或响应的内容。
  • 可用于:方法。
  • 属性:
    • mediaType:内容的媒体类型。
    • schema:指定 @Schema 注解的对象,用于描述内容的数据类型。
@Schema
  • 描述:用于描述数据模型的属性。
  • 可用于:方法、类、接口。
  • 属性:
    • title:数据模型的标题。
    • description:数据模型的描述。
    • type:数据模型的类型。
    • format:数据模型的格式。

4. 路径注解

以下注解用于描述 API 的路径:

@Path
  • 描述:用于定义路径参数。
  • 可用于:方法。
  • 属性:
    • value:路径参数的名称。
@PathVariable
  • 描述:用于描述路径参数。
  • 可用于:方法的参数。
  • 属性:
    • value:路径参数的名称。
@RequestParam
  • 描述:用于描述查询参数。
  • 可用于:方法的参数。
  • 属性:
    • value:查询参数的名称。
    • required:查询参数是否必需,默认为 false
@RequestBody
  • 描述:用于描述请求体。
  • 可用于:方法的参数。

5. 响应注解

以下注解用于描述 API 的响应结果:

@ApiResponse
  • 描述:用于描述响应结果。
  • 可用于:方法。
  • 属性:
    • responseCode:响应的状态码。
    • description:响应的描述。
    • content:指定 @Content 注解的对象数组,用于描述响应的内容。
@Content
  • 描述:用于描述响应结果的内容。
  • 可用于:方法。
  • 属性:
    • mediaType:内容的媒体类型。
    • schema:指定 @Schema 注解的对象,用于描述内容的数据类型。
@Schema
  • 描述:用于描述数据模型的属性。
  • 可用于:方法、类、接口。
  • 属性:
    • title:数据模型的标题。
    • description:数据模型的描述。
    • type:数据模型的类型。
    • format:数据模型的格式。

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

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

相关文章

xxl-job适配达梦数据库

参考资料&#xff1a; 【达梦数据库】从 Mysql 迁移到 DM8_从 mysql 移植到 dm Xxl-job适配达梦数据库 Xxl-job适配达梦数据库 按照这篇文章修改所有Mapper.xml文件&#xff0c;但是运行会报错。 按照下面的文章修改 XxlJobLogMapper.xml 如何将 XxlJob 集成达梦数据库_xx…

矩阵转置(c语言)

1.KiKi有一个矩阵&#xff0c;他想知道转置后的矩阵&#xff08;将矩阵的行列互换得到的新矩阵称为转置矩阵&#xff09;&#xff0c;请编程帮他解答。 //输入描述&#xff1a; //第一行包含两个整数n和m&#xff0c;表示一个矩阵包含n行m列&#xff0c;用空格分隔。(1≤n≤10…

SQLite 数据库安装及使用(Linux)

目录 引言 SQLite 的特点 SQLite 的应用场景 SQLite数据库的安装 方法一&#xff1a;使用包管理器安装 方法二&#xff1a; 从源码编码安装 SQLite数据库的基础命令 1.系统命令 2.SQL命令 sqlite编程接口 引言 SQLite 是一种轻量级的数据库管理系统&#xff0c;它不…

uniapp项目-购物商城【无接口,下载改appid即可使用】

&#x1f939;‍♀️潜意识起点&#xff1a;个人主页 &#x1f399;座右铭&#xff1a;得之坦然&#xff0c;失之淡然。 &#x1f48e;擅长领域&#xff1a;大前端 是的&#xff0c;我需要您的&#xff1a; &#x1f9e1;点赞❤️关注&#x1f499;收藏&#x1f49b; 是我…

零样本学习——从多语言语料库数据中对未学习语言进行语音识别的创新技术

引言 在全球众多的语言中&#xff0c;只有极少数的语言在语音识别领域取得了显著的进展。这种不平衡现象的主要原因是&#xff0c;现有的语音识别模型往往依赖于大量的标注语音数据&#xff0c;而这些数据对于许多语言来说难以获得。 近年来&#xff0c;尽管语音识别技术取得…

6.3 第三方库的安装与使用

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

英镑与日元:货币市场的双重挑战

一、英镑的波动与策略 近期&#xff0c;英镑兑所有主要货币出现大幅下挫&#xff0c;尤其是在7月&#xff0c;英镑成为投机市场最大的净多头仓位。然而&#xff0c;上周英镑抹去了第二季的大部分涨幅&#xff0c;主要受到英国央行对利率前景的鸽派重新定价的影响&#xff0c;以…

【生信入门】预览快速体验Linux-重生之小明闯Linux

生信少走弯路,快试试生信云专用服务器。新用户注册免费体验5小时。https://www.tebteb.cc 一.故事 小明的Linux冒险 在一片混沌的黑暗中&#xff0c;小明睁开了眼睛。他感到头痛欲裂&#xff0c;四周一片漆黑&#xff0c;只有一行闪烁的字符映入眼帘&#xff1a; [xiaomingu…

如何实现Redis和Mysql中数据双写一致性

在我们的实际开发中&#xff0c;我们用到了redis缓存一些常用的数据&#xff08;如热点数据&#xff09;用来提高系统的吞吐量。 但是不可以避免的出现了数据的修改场景&#xff0c;这就导致了数据库中的数据和Redis中出现不一致性的情况。如何保证数据一致性就显得非常重要了&…

H3C智能管理中心byod/index.xhtml接口存在远程命令执行漏洞

@[toc] H3C智能管理中心byod/index.xhtml接口存在远程命令执行漏洞 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学…

C++基础编程的学习3

nullptr关键字 在C11之前&#xff0c;空指针通常用NULL或0表示。然而&#xff0c;这些表示方法存在类型安全问题。C11引入了nullptr关键字&#xff0c;它提供了一个明确的、类型安全的空指针值。 Lambda表达式 Lambda表达式是C11引入的一种便捷的匿名函数定义方式。当Lambda…

海量数据处理商用短链接生成器平台 - 12

第三十五章 微信支付Native订单API测试实战和签名流程解读 第1集 微信支付-快速验证参数配置方法和统一下单接口开发 简介&#xff1a;微信支付-快速验证参数配置方法和统一下单接口开发 接口文档 https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_4_1.shtml 编码实…

03_Electron 主进程和渲染进程、点击(拖放)打开文件功能

Electron 主进程和渲染进程 一、Electron 主进程和渲染进程二、Electron 主进程和渲染进程中使用 Nodejs 以及 Nodejs 第三方模块2.1、主进程中使用 Nodejs 模块2.2、渲染进程中 使用 Nodejs 模块2.3、BrowserWindow 中通过 preload加载的js 文件可以直接使用nodejs 模块2.4、渲…

大小仅为Rust四分之一!MoonBit 现已支持Wasm组件模型

使用 MoonBit 开发 Wasm 组件模型 Wasm组件 WebAssembly&#xff08;Wasm&#xff09;是一种新的低级虚拟指令集标准&#xff08;low-level virtual instruction set standard&#xff09;&#xff0c;用于沙箱模型。低级的&#xff0c;意味着它接近原生速度。虚拟的&#xff…

全网最最最全的LVS详解!!!

1 LVS-集群和分布式 1.1 集群 LVS&#xff08;Linux Virtual Server&#xff09;集群&#xff0c;即Linux虚拟服务器集群&#xff0c;是一个在Unix/Linux平台下实现负载均衡集群功能的系统。它由国人章文嵩博士在1998年开发&#xff0c;是中国国内最早出现的自由软件项目之一…

yolov8 剪枝 - DepGraph

2024年8月5 5000张图片&#xff0c;2个类别。 yolov8n 初始&#xff1a; 185 layers, 3151904 parameters, 31936 gradients, 8.7 GFLOPs 经过三次finetune后&#xff1a; 185 layers, 2327024 parameters, 31936 gradients, 6.6 GFLOPs 经过第四次fintune后&#xff1a; …

“write()” 与 “ tcp缓冲区 ” 之间的关系

write&#xff08;&#xff09;写入tcp缓冲区过程 write&#xff08;&#xff09;将该文本写入到tcp缓冲区中本质是数据的拷贝&#xff0c;当write()调用完&#xff0c;数据不一定发给tcp发送缓冲区中 因为&#xff1a; 有没有拷贝成功&#xff0c;都不由write&#xff08;&a…

史上最全Java初、中、高三级都适用的面试八股文(2024版含答案)

在Java编程的世界里&#xff0c;无论你是初出茅庐的新人&#xff0c;还是已经有一定经验的中级开发者&#xff0c;抑或是寻求突破的高级工程师&#xff0c;面试时总有一套通用的“八股文”知识点&#xff0c;就像是每位程序员的必备宝典。这套2024版的Java面试指南&#xff0c;…

mma.sync.aligned.m16n8k16.row.col.f16.f16.f16.f16测试

mma.sync.aligned.m16n8k16.row.col.f16.f16.f16.f16测试 1.参考文档2.numpy测试3.cuda kernel测试4.相关截图 本文演示了如何按PTX指令文档中的layout格式要求,加载数据,执行mma指令,并且跟numpy对比结果的一致性 1.参考文档 Matrix Fragments for mma.m16n8k16 with floatin…

MAVSDK添加自定义消息与函数实现云台(Gimbal)调整功能

1.找到action.proto文件并添加如下消息 2. 定义RPC方法AdjustGimbal方法如下: 3.运行generate_from_protos.sh重新根据.proto生成.cpp与.h文件 生成过程 生成完成 4. .proto生成的.h文件,成功包含同步与异步方法声明