【Spring Boot】构建RESTful服务 — 使用Swagger生成Web API文档

news2024/11/25 6:15:21

使用Swagger生成Web API文档

高质量的API文档在系统开发的过程中非常重要。本节介绍什么是Swagger,如何在Spring Boot项目中集成Swagger构建RESTful API文档,以及为Swagger配置Token等通用参数。

1.什么是Swagger

Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务,是非常流行的API表达工具。

普通的API文档存在以下问题:

1)由于接口众多,并且细节复杂(需要考虑不同的HTTP请求类型、HTTP头部信息、HTTP请求内容等),创建这样一份高质量的文档是一件非常烦琐的工作。

2)随着需求的不断变化,接口文档必须同步修改,就很容易出现文档和业务不一致的情况。为了解决这些问题,Swagger应运而生,它能够自动生成完善的RESTful API文档,并根据后台代码的修改同步更新。这样既可以减少维护接口文档的工作量,又能将说明内容集成到实现代码中,让维护文档和修改代码合为一体,实现代码逻辑与说明文档的同步更新。另外,Swagger也提供了完整的测试页面来调试API,让API测试变得轻松、简单。

2.使用Swagger生成Web API文档

在Spring Boot项目中集成Swagger同样非常简单,只需在项目中引入springfox-swagger2和springfox-swagger-ui依赖即可。下面就以之前的用户管理模块接口为例来感受Swagger的魅力。

步骤01 配置Swagger的依赖。

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

在上面的示例中,在项目pom.xml配置文件中引入了springfox-swagger2和springfox-swagger-ui两个依赖包。其中swagger2是主要的文档生成组件,swagger-ui为页面显示组件。

步骤02 创建Swagger2配置类。

@Configuration
@EnableSwagger2
public class SwaggerConfig implements WebMvcConfigurer {
    @Bean
    public Docket createRestApi () {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.example.demo.controller"))
                .paths(PathSelectors.any())
                .build();
    }
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("Spring boot中使用Swagger2构建RESTful APIs")
                .description("相关文章请关注:https://blog.csdn.net/weixin_45627039?spm=1000.2115.3001.5343")
                .termsOfServiceUrl("https://blog.csdn.net/weixin_45627039?spm=1000.2115.3001.5343")
                // .contact("架构师精进")
                .version("1.0")
                .build();
    }
    /**
     * swagger增加url映射
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars");
    }
}

在上面的示例中,我们在SwaggerConfig的类上添加了@Configuration和@EnableSwagger2两个注解。

@Configuration注解让Spring Boot来加载该类配置。

@EnableSwagger2注解启用Swagger2,通过配置一个Docket Bean,来配置映射路径和要扫描的接口所在的位置。

apiInfo主要配置Swagger2文档网站的信息,比如网站的标题、网站的描述、使用的协议等。

需要注意的是:

1)basePackage可以在SwaggerConfig中配置com.weiz.example01.controller,也可以在启动器ComponentScan中配置。

2)需要在SwaggerConfig中配置Swagger的URL映射地址:/swagger-ui.html。

步骤03 添加文档说明内容。

上面的配置完成之后,接下来需要在API上增加内容说明。我们直接在之前的用户管理模块的UserController中增加相应的接口内容说明,代码如下:

    @Api(tags = {"用户接口"})
    @RestController
    public class UserController {
            @ApiOperation(value="创建用户", notes="根据User对象创建用户")
            @PostMapping(value ="user")
            public JSONResult save(@RequestBody User user){
                System.out.println("用户创建成功:" + user.getName());
                return JSONResult.ok(201, "用户创建成功");
            }
            @ApiOperation(value="更新用户详细信息", notes="根据id来指定更新对象,并根据传过来的user信息来更新用户详细信息")
            @PutMapping(value = "user")
            public JSONResult update(@RequestBody User user) {
                System.out.println("用户修改成功:" + user.getName());
                return JSONResult.ok(203, "用户修改成功");
            }
            @ApiOperation(value="删除用户", notes="根据url的id来指定删除对象")
            @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType ="Long", paramType = "query")
            @DeleteMapping("user/{userId}")
            public JSONResult delete(@PathVariable String userId) {
                System.out.println("用户删除成功:" + userId);
                    return JSONResult.ok(204,"用户删除成功");
            }
    }

在上面的示例中,主要为UserController中的接口增加了接口信息描述,包括接口的用途、请求参数说明等。

1)@Api注解:用来给整个控制器(Controller)增加说明。

2)@ApiOperation注解:用来给各个API方法增加说明。

3)@ApiImplicitParams、@ApiImplicitParam注解:用来给参数增加说明。

步骤04 查看生成的API文档。

完成上面的配置和代码修改之后,Swagger 2就集成到Spring Boot项目中了。接下来启动项目,在浏览器中访问http://localhost:8080/swagger-ui.html,Swagger会自动构建接口说明文档,如图所示。

在这里插入图片描述
Swagger自动将用户管理模块的全部接口信息展现出来,包括接口功能说明、调用方式、请求参数、返回数据结构等信息。

在Swagger页面上,我们发现每个接口描述右侧都有一个按钮try it out,单击try it out按钮即可调用该接口进行测试。如图所示,在获取人员信息的接口上单击try it out按钮,输入userId的请求参数“2001”,单击Execute按钮就会将请求发送到后台,从而进行接口验证测试。

在这里插入图片描述

3.为Swagger添加token参数

很多时候,客户端在调用API时需要在HTTP的请求头携带通用参数,比如权限验证的token参数等。但是Swagger是怎么描述此类参数的呢?接下来通过示例演示如何为Swagger添加固定的请求参数。

其实非常简单,修改Swagger2Config配置类,利用ParameterBuilder构成请求参数。具体示例代码如下:

@Configuration
@EnableSwagger2
public class SwaggerConfig implements WebMvcConfigurer {
    @Bean
    public Docket createRestApi() {
        ParameterBuilder parameterBuilder = new ParameterBuilder();
        List<Parameter> parameters = new ArrayList<Parameter>();
        parameterBuilder.name("token").description("token令牌")
                .modelRef(new ModelRef("string")).parameterType("header").required(false).build();
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.example.demo.controller"))
                .paths(PathSelectors.any())
                .build()
                .globalOperationParameters(parameters);
    }
    ...
}

在上面的示例中,通过ParameterBuilder类把token作为全局统一的参数添加到HTTP的请求头中。系统所有的API都会统一加上此参数。

完成之后重新启动应用,再次查看接口,如图所示,我们可以看到接口参数中已经支持发送token请求参数。

在这里插入图片描述
人员管理模块中的所有API都统一加上了token参数,调用时Swagger会将token参数自动加入HTTP的请求头。

4.Swagger常用注解

Swagger提供了一系列注解来描述接口信息,包括接口说明、请求方法、请求参数、返回信息等,常用注解如表所示。

在这里插入图片描述
在实际项目中,Swagger除了提供@ApiImplicitParams注解描述简单的参数之外,还提供了用于对象参数的@ApiModel和@ApiModelProperty两个注解,用于封装的对象作为传入参数或返回数据。

@ApiModel负责描述对象的信息

@ApiModelProperty负责描述对象中属性的相关内容

以上是在项目中常用的一些注解,利用这些注解就可以构建出清晰的API文档。

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

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

相关文章

3.2 Tomcat基础

1. Tomcat概述 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器。 Tomcat版本&#xff1a;apache-tomcat-8.5.76。 2.IDEA集成Tomcat 第一步 第二步 第三步 ​ 编辑切换为居中 添加图片注释&#xff0c;不超过 140 字&#xff0…

nodejs+vue+elementui,图书评论管理系统_g9e3a

用户的功能主要是对首页、图书信息、公告信息、在线咨询、个人中心等进行操作。表名&#xff1a;token语言 node.js 框架&#xff1a;Express 前端:Vue.js 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;VScode 前端nodejsvueelementui, 管理员…

绿盟sas安全审计系统任意文件读取漏洞

绿盟sas安全审计系统任意文件读取漏洞 一、产品简介二、漏洞概述三、影响范围四、复现环境POC小龙检测工具: 五、修复建议 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失…

022 - STM32学习笔记 - 扩展外部SDRAM(一) - 初识SDRAM和FMC

022 - STM32学习笔记 - 扩展外部SDRAM&#xff08;一&#xff09; - 初识SDRAM和FMC 之前学习了I2C读写EEPROM和SPI读写FLASH&#xff0c;学完之后在学习一种新的存储介质–SDRAM。 一、初识SDRAM 我们知道在stm32内部是有一定大小的SRAM&#xff08;256Kb&#xff09;和FLA…

C语言案例 分数列求和-11

题目&#xff1a;有一分数列&#xff1a;2 / 1,3 / 2,5 / 3,8 / 5,13 / 8,21 / 13 …求出这个数列的前20项之和。 程序分析 这是一个典型的分数列数学逻辑题&#xff0c;考究这类题目是需要从已知的条件中找到它们的分布规律 我们把前6荐的分子与分母分别排列出来&#xff0c;…

白帽黑帽与linux安全操作

目录 白帽黑帽 Linux安全 白帽黑帽 白帽&#xff08;White Hat&#xff09;和黑帽&#xff08;Black Hat&#xff09;通常用于描述计算机安全领域中的两种不同角色。白帽黑客通常被认为是合法的安全专家&#xff0c;他们通过合法途径寻找和修复安全漏洞&#xff0c;帮助企业和…

【大数据之Flume】八、Flume 数据流监控

1 Ganglia 的安装与部署 &#xff08;1&#xff09;安装 安装规划&#xff1a; 在hadoop102、103、104安装epel-release&#xff1a; sudo yum -y install epel-release在102安装&#xff1a;web、gmetad、gmod&#xff1a; sudo yum -y install ganglia-gmetad sudo yum -y…

【Java】智慧工地云平台源码-支持私有化部署+硬件设备

智慧工地硬件设备包括&#xff1a;AI识别一体机、智能广播音响、标养箱、塔机黑匣子、升降机黑匣子、吊钩追踪控制设备、扬尘监测设备、喷淋设备。 1.什么是AI危险源识别 AI危险源识别是指基于智能视频分析技术&#xff0c;对视频图像信息进行自动分析识别&#xff0c;以实时监…

cmake扩展(1)——VS+CMake创建Qt项目

创建项目 创建CMakeLists #cmake最低版本 cmake_minimum_required(VERSION 3.10) #项目名 project(regextool)#查找所有*.h,*.ui,*.cpp文件&#xff0c;并存入SOURCES中 file(GLOB SOURCES "*.cpp" "*.ui" "*.h")#开启moc set(CMAKE_AUTOMOC O…

SCAU操作系统知识点之(九)单处理器调度

1、处理器调度的类型–长程&#xff0c;中程&#xff0c;短程 例&#xff1a;作业调度程序从处于_____A______状态的队列中选取适当的作业投入运行。 A. 后备 B. 提交 C. 运行 D. 完成 例&#xff1a;**“选一个进程占用 CPU”**是____A_____的功能。 A. 短程调度 B. 中程调度 …

重要日期提醒软件有哪些?有没有适合提醒自己的软件

在时间如潮水般流逝的时代&#xff0c;我们总是在忙碌中度过日子。然而&#xff0c;纵使再忙碌&#xff0c;我们也不能忘记那些温馨而重要的日期&#xff0c;因为这些日期是我们生活中最珍贵的记忆。 无论是生日、纪念日还是重要节日&#xff0c;这些日期都是我们生活的点滴&a…

快速上手ProtoBuf

目录&#xff1a; 需求&#xff1a;引⼊ProtoBuf包创建.proto⽂件编译contacts.proto⽂件&#xff0c;⽣成JAVA⽂件编译contacts.proto⽂件后会⽣成什么序列化与反序列化的使⽤⼩结ProtoBuf使⽤流程 1.需求&#xff1a; 在快速上手中&#xff0c;会编写第一版本的通讯录1.0。…

【JZ36 二叉搜索树与双向链表】

目录 1.题目描述2.算法思想3.代码实现 1.题目描述 2.算法思想 注意点&#xff1a;为什么要引用传参&#xff1f;原因如下&#xff1a; 3.代码实现 class Solution { public:void inorder(TreeNode* cur,TreeNode*& prev){if(curnullptr){return ;}inorder(cur->left,…

pve组网实现公网访问pve,访问电脑,访问pve中的openwrt同时经过openwrt穿透主路由地址nginx全公网访问最佳办法测试研究...

一台路由器 做主路由 工控机 装pve虚拟机 虚拟机里面装一个openwrt, 外网可以直接访问pve,可以访问pve里的openwrt 一台主机 可选择连 有4个口&#xff0c;分别eth0,eth1,eth2,eth3 pve有管理口 这个情况下 &#xff0c;没有openwrt 直接电脑和pve管理口连在一起就能进pve管理界…

vue3 + vite + ts 封装 SvgIcon组件

环境 vite vue3 ts "vue": "^3.3.4", "vite": "^4.4.0", "typescript": "^5.0.2",# 需要下载的依赖 "vite-plugin-svg-icons": "^2.0.1",不同版本可能存在一定差异, 这篇文章不可能对应所…

数学建模(一)前继概念

课程推荐&#xff1a;数学建模老哥_哔哩哔哩_bilibili 目录 一、什么是数学建模&#xff1f; 二、数学建模的一般步骤 三、数学建模赛题类型 1.预测型 2. 评价类 3.机理分析类 4. 优化类 一、什么是数学建模&#xff1f; 数学建模是利用数学方法解决实际问题的一种实践。…

关于ISO27701隐私信息安全管理体系介绍

01 什么是ISO27701 ISO27701是对ISO27001信息安全管理和ISO27002安全控制的隐私扩展&#xff0c;全称《安全技术—扩展ISO27001和ISO27002的隐私信息管理—要求与指南》&#xff0c;是ISO标准委员会以ISO 27001为基准&#xff0c;以ISO27552为蓝本&#xff0c;建立发布的隐私…

Flink多流处理之Broadcast(广播变量)

写过Spark批处理的应该都知道,有一个广播变量broadcast这样的一个算子,可以优化我们计算的过程,有效的提高效率;同样在Flink中也有broadcast,简单来说和Spark中的类似,但是有所区别,首先Spark中的broadcast是静态的数据,而Flink中的broadcast是动态的,也就是源源不断的数据流.在…

docker-compose redis 一直启动失败

环境&#xff1a; centos 8.x 背景 使用docker-compose 来启动redis docker-compose.yml 如下&#xff1a; version: 3.3 services:redis:image: redis:latestrestart: alwayscontainer_name: redisports:- 6379:6379volumes:- ./data:/redis/data- ./redis.conf:/redis/re…

JMeter 查看 TPS 数据,详细指南

TPS 是软件测试结果的测量单位。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时&#xff0c;收到服务器响应后结束计时&#xff0c;以此来计算使用的时间和完成的事务个数。在 JMeter 中&#xff0c;我们可以使用以下方法查看 T…