【SpringBoot】5 Swagger

官网

https://swagger.io/

介绍

Swagger 是一套基于 OpenAPI 规范构建的开源工具,可以帮助开发者实现设计、构建、记录、使用 Rest API。
Swagger 是一款根据 Restful 风格生成的接口开发文档,并且支持做测试的一款中间软件。
Swagger主要包括三部分:

  • Swagger Editor:基于浏览器的编辑器,开发者可以使用它来编写我们的 OpenAPI 文档。
  • Swagger UI:它会将开发者编写的 OpenAPI 规范呈现为交互式的 API 文档。
  • Swagger CodeGen:它可以通过为 OpenAPI 规范定义的任何 API 生成服务器存根和客户端 SDK 来简化构建过程。

用处:

  • 后端
    • 不用再厚些 WiKi 接口拼接大量参数,避免手写出现的错误。
    • 对代码侵入性低,采用注解的方式,开发简单。
    • 方法参数名修改、增加、减少参数都可以直接生效,不用再手动进行维护。
    • 缺点:增加开发成本,写接口需要再写一套参数配置。
  • 前端
    • 后端只需要定义好接口,swagger会自动生成文档,接口功能、参数一目了然。
    • 联调方便,如果出现问题,可以直接测试接口,实时检查参数和返回值,可以快速定位是前端还是后端的问题。
  • 测试
    • 对于某些没有前端界面 UI 功能,可以用它来测试接口。
    • 操作简单,不用了解具体代码就可以进行操作。

依赖

pom.xml

<!-- 引入swagger3包 -->
<dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version>
</dependency>

配置类

SwaggerConfig.java

package com.lm.system.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;import java.util.Collections;
import java.util.List;/*** @Author: DuHaoLin* @Date: 2024/7/26*/
@Configuration
public class SwaggerConfig {//访问地址: http://localhost:8888/swagger-ui/index.htmlprivate static final String basePackage = "com.lm.system";@Beanpublic Docket api() {return new Docket(DocumentationType.OAS_30)//设置API文档的基本信息.apiInfo(apiInfo())//进入API选择器的配置.select()//设置API选择器的基本包路径,表示只选择该包及其子包中的API进行文档生成。.apis(RequestHandlerSelectors.basePackage(basePackage))//设置API选择器的路径选择器,表示选择所有路径的API进行文档生成。.paths(PathSelectors.any()).build()//小按钮进行方法的调用.securitySchemes(Collections.singletonList(securityScheme())).securityContexts(Collections.singletonList(securityContext()));}//这个是swagger页面中的一个小按钮,可以用来放token。//定义API的安全方案private SecurityScheme securityScheme() {//return new ApiKey("Authorization", "Authorization", "header");//创建一个ApiKey对象,传入三个参数,分别为密钥的名称、密钥的描述和认证方式。//这里的密钥名称和描述都设置为X-Token,认证方式为header,表示在请求的Header中进行认证。return new ApiKey("X-Token", "X-Token", "header");}//定义API的安全上下文。private SecurityContext securityContext() {return SecurityContext.builder().securityReferences(defaultAuth())  //设置安全上下文的安全引用.forPaths(PathSelectors.regex("^(?!auth).*$"))  //设置安全上下文的路径选择器.除了以/auth开头的路径外,所有路径都需要进行安全认证.build();}//用于定义API的安全引用private List<SecurityReference> defaultAuth() {//授权范围的名称设置为global,描述设置为accessEverything,表示具有全局访问权限AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");//将前面创建的authorizationScope对象赋值给数组的第一个元素。AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];authorizationScopes[0] = authorizationScope;//认证方案的名称设置为X-Token.授权范围的数组为前面创建的authorizationScopes数组。return Collections.singletonList(new SecurityReference("X-Token", authorizationScopes));}//一些swagger的信息配置private ApiInfo apiInfo() {return new ApiInfoBuilder()//接口标题名.title("System接口文档")//接口描述.description("")//版本.version("1.0")//作者信息.contact(new Contact("ldh", "https://www.baidu.com", "ldh_dev@163.com")).build();}}

统一返回结果

依赖

pom.xml

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version><optional>true</optional>
</dependency><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.9</version>
</dependency>

返回结果类

ResultBody.java

package com.lm.system.common;import com.google.gson.*;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpStatus;import javax.servlet.http.HttpServletResponse;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Collection;
import java.util.Map;/*** @Author: DuHaoLin* @Date: 2024/7/26*/@Data
@Slf4j
@Accessors(chain = true)
@AllArgsConstructor
public class ResultBody<T> implements Serializable {private static final long serialVersionUID = 1L;@ApiModelProperty("状态码: 404")private long status;@ApiModelProperty("返回信息")private String msg;@ApiModelProperty("数据总数")private long count;@ApiModelProperty("返回数据")private T data;public static final Gson GSON;static {final JsonSerializer<LocalDateTime> localDateTimeJsonSerializer = (src, typeOfSrc, context) ->new JsonPrimitive(src.withNano(0).atZone(ZoneId.systemDefault()).format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));final JsonSerializer<LocalDate> localDateJsonSerializer = (src, typeOfSrc, context) ->new JsonPrimitive(src.format(DateTimeFormatter.ISO_LOCAL_DATE));GSON = new GsonBuilder().serializeNulls() //包括空参.setPrettyPrinting() //格式化.registerTypeAdapter(LocalDateTime.class, localDateTimeJsonSerializer) //类型适配器.registerTypeAdapter(LocalDate.class, localDateJsonSerializer) //类型适配器.setDateFormat("yyyy-MM-dd HH:mm:ss") //日期格式.disableHtmlEscaping() //禁用Http转义.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) //小写下划线.create();}@Overridepublic String toString() {return getReturn();}private ResultBody() {}public static <T> ResultBody<T> build() {return createResponse(0, null);}public static <T, V extends Collection<T>> ResultBody<V> build(V collection) {return createResponse(collection.size(), collection);}public static <T, R> ResultBody<Map<T, R>> build(Map<T, R> map) {return createResponse(map.size(), map);}public static <T> ResultBody<T> build(T map) {if (map == null) return build();return createResponse(1, map);}public static <T> ResultBody<T> build(HttpStatus status) {return new ResultBody<T>().setStatus(status.value());}private static <T> ResultBody<T> createResponse(long size, T data) {ResultBody<T> resultBody;if (size == 0) {resultBody = build(HttpStatus.NO_CONTENT);} else {resultBody = build(HttpStatus.OK);resultBody.count = size;}resultBody.data = data;return resultBody;}public String getReturn() {String json = GSON.toJson(this);log.info(json);return json;}}

接口

将 Usercontroller 改为 UserPageController 。
新建 UserController 类。

UserPageController.java

package com.lm.system.controller;import com.lm.system.common.User;
import io.swagger.annotations.Api;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;/*** @Author: DuHaoLin* @Date: 2024/7/26*/
@Controller
@Api(tags = "用户页面")
public class UserPageController {@GetMapping("userPage")public String user(Model model) {User user = User.builder().name("Tom").age(18).gender(0).build();model.addAttribute("user", user);return "user";}}

User.java

package com.lm.system.common;import io.swagger.annotations.ApiModel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.time.LocalDateTime;/*** @Author: DuHaoLin* @Date: 2024/7/26*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("用户实体类")
public class User {private Integer id;private String name;private Integer age;private Integer gender; //性别:0男,1女private LocalDateTime createTime;private LocalDateTime updateTime;private Integer deleted; //是否已经删除:0否,1是}

UserController.java

package com.lm.system.controller;import com.lm.system.common.ResultBody;
import com.lm.system.common.User;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.http.HttpStatus;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.time.LocalDateTime;
import java.util.Objects;/*** @Author: DuHaoLin* @Date: 2024/7/26*/
@RestController
@Api(tags = "用户接口")
public class UserController {@GetMapping("user")@ApiOperation("获取用户信息")public String user() {User user = User.builder().name("Tom").age(18).gender(0).build();return ResultBody.build(HttpStatus.OK).setData(user).setCount(1).getReturn();}}

user.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Thymeleaf</title>
</head>
<body><span>姓名:</span><span th:text="${user.name}"></span><br /><span>年龄:</span><span th:text="${user.age}"></span><br /><span>性别:</span><span th:text="${user.gender} == 0 ? '男' : '女'"></span>
</body>
</html>

效果图

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

项目目录结构

在这里插入图片描述

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

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

相关文章

AI绘画;Stable Diffusion再升级:学会以图生图!

前言 Stability AI 很高兴地宣布推出 Stable Diffusion Reimagine&#xff01;我们邀请用户通过 Stable Diffusion 尝试图像并“重新构想”他们的设计。 Stable Diffusion Reimagine 是一种新的 Clipdrop 工具&#xff0c;它允许用户无限制地生成单个图像的多个变体。无需复杂…

科研绘图系列:R语言山脊图(Ridgeline Chart)

介绍 山脊图(Ridge Chart)是一种用于展示数据分布和比较不同类别或组之间差异的数据可视化技术。它通常用于展示多个维度或变量之间的关系,以及它们在不同组中的分布情况。山脊图的特点: 多变量展示:山脊图可以同时展示多个变量的分布情况,允许用户比较不同变量之间的关…

【Java基础语法】字符修改,以及equals的用法

前言&#xff1a; 小编这里将上一期String类型进行了补充&#xff0c;添加了字符串的修改&#xff0c;以及equals的用法内容&#xff0c;和hashcode的使用&#xff1b;上一期&#xff1a;http://t.csdnimg.cn/ijiM6 1.字符串的修改 在上一期中我们说到字符串是不能被修改的&am…

计算机视觉项目-2024年第3号超强台风“格美”登陆福建带来大暴雨造成城市积水,通过模型识别路段积水避开积水道路

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉项目-2024年第3号超强台风“格美”登陆福建带来大暴雨造成城市积水&#xff0c;通过模型识别路段积水避开积水道路。今年第3号台风“格美”(强台风级)的中心今天(24日)早晨5点钟位于我国台湾省宜兰县东南…

多表查询的内连接与外连接

目录 1. 内连接 1.1 概述 1.2 等值连接 1.3 非等值连接 1.4 自连接 2. 外连接 2.1 概述 2.2 左/右连接 2.3 全连接 3. 多张表连接 1. 内连接 1.1 概述 查询满足条件的两张表数据&#xff0c;也就是两张表的交集&#xff1b; 内连接使用过程中&#xff0c;尽量对表重…

linux系统安装pytorch_中文地址命名实体识别案例

命名实体有关文章参考这篇文章 中文地址命名实体识别训练和预测 win10系统安装cuda环境参考这篇文章 搭建Pytorch的GPU环境超详细 1、下载python https://www.python.org/downloads/release/python-368/ 2、下载python包 https://pypi.org/search/?q=transformers 1、搜…

董宇辉离职,我一点都不意外!只不过感觉来的太快

下面这张图&#xff0c;是我在半年多前写的一段随笔&#xff0c;没想到来的这么快&#xff01; 碰巧的是今天中午&#xff0c;在开发者群里有两位老铁自曝&#xff0c;本以为能公司干到老&#xff0c;但公司却不给机会&#xff0c;已经不在是公司员工了。 最近&#xff0c;晓衡…

C++——QT:保姆级教程,从下载到安装到用QT写出第一个程序

登录官网&#xff0c;在官网选择合适的qt版本进行下载 这里选择5.12.9版本 点击exe文件下载&#xff0c;因为服务器在国外&#xff0c;国内不支持&#xff0c;所以可以从我的网盘下载 链接: https://pan.baidu.com/s/1XMILFS1uHTenH3mH_VlPLw 提取码: 1567 --来自百度网盘超级…

我澄清下,大数据界面虽然有点花,但对趋势的判断还是很准的!

我澄清下&#xff0c;大数据界面虽然有点花&#xff0c;但对趋势的判断还是很准的&#xff01; 艾斯视觉的观点认为&#xff1a;在这个充满不确定性的世界里&#xff0c;大数据就像一位智者&#xff0c;透过那些令人眼花缭乱的界面&#xff0c;总能以它独到的洞察力&#xff0…

matlab笔记 - 最小二乘法拟合直线的原理与实现

最小二乘法拟合直线原理与实现 一、引言二、原理概述1. 建模思路2.误差函数3.求解最优参数 三、matlab实现最小二乘法拟合直线1.直接代码实现2.MATLAB内置函数实现 四、扩展统计学与回归分析经济学工程学图像处理机器学习 一、引言 最小二乘法&#xff08;Least Squares Metho…

遇到Websocket就不会测了?别慌,学会这个Jmeter插件轻松解决....

websocket 是一种双向通信协议&#xff0c;在建立连接后&#xff0c;websocket服务端和客户端都能主动向对方发送或者接收数据&#xff0c;而在http协议中&#xff0c;一个request只能有一个response&#xff0c;而且这个response也是被动的&#xff0c;不能主动发起。 websoc…

常见的jmeter面试题及答案

1、解释什么是JMeter? JMeter是一款Java开源工具&#xff0c; 用于性能负载测试。它旨在分析和衡量Web应用程序和各种服务的性能和负载功能行为。 2、说明JMeter的工作原理? JMeter就像一群将请求发送到目标服务器的用户-样。它收集来自目标服务器的响应以及其他统计数据&…

WARNING: Ignoring invalid distribution -ip警告信息如何去掉?

查看已安装依赖列表的时候&#xff0c;出现了很多警告信息&#xff0c;如何去掉呢&#xff1f; 解决办法 打开这个路径&#xff1a;d:\software\python\python39\lib\site-packages 这种波浪线开头的&#xff0c;我们将它删除掉,就可以了。

结构体,联合体,指针和浮点代码笔记

系列文章 : 深入理解计算机系统笔记 文章目录 系列文章3.9 异质的数据结构3.9.1 结构3.9.2 联合3.9.3 数据对齐 3.10 在机器级程序中将控制和数据结合起来3.10.1 理解指针3.10.2 应用&#xff1a;使用GDB调试器3.10.3 内存越界引用和缓冲区溢出3.10.4 对抗缓冲区溢出攻击3.10…

2.1、matlab绘图汇总(图例、标题、坐标轴、线条格式、颜色和散点格式设置)

1、前言 在 MATLAB 中进行绘图是一种非常常见且实用的操作&#xff0c;可以用来可视化数据、结果展示、分析趋势等。通过 MATLAB 的绘图功能&#xff0c;用户可以创建各种类型的图形&#xff0c;包括线图、散点图、柱状图、曲线图等&#xff0c;以及三维图形、动画等复杂的可视…

京东云ifrit-agent占用80端口问题

即使停止服务后还是会自动重启&#xff0c;网上查找无果后询问京东云客服&#xff0c;人家服务蛮好&#xff0c;回复很快 解决办法 centos7&#xff1a; 停止服务 systemctl stop ifritd 卸载 rm -rf /usr/local/share/jcloud/ifrit centos 6: 停止服务 cd /usr/local…

Windows系统安装FinalShell

一、下载 通过百度网盘分享的文件&#xff1a;finalshell_install.exe 链接&#xff1a;https://pan.baidu.com/s/1_vcb_t-Cp4TZSN4nWUmLww 提取码&#xff1a;d6v8 二、安装 三、远程连接Linux系统 (1)打开VMware虚拟机 右键空白区域&#xff0c;点击open Terminal 输入命令…

AI/机器学习(计算机视觉/NLP)方向面试复习3

1. Pooling 有哪些方式&#xff1f;pytorch的实现&#xff1f; Pooling可以分成&#xff1a;最大池化&#xff0c;平均池化&#xff0c;全局平均池化&#xff0c;随机池化&#xff0c;空间金字塔池化。 1. 最大池化&#xff08;Max Pooling&#xff09; 最大池化是最常用的池…

YOLOv8魔改核心-模型yaml文件解析与网络结构打印

前言 本篇文章主要用于记录学习YOLOv8中网络模型yaml文件&#xff0c;我们一般只知道如何去训练模型&#xff0c;和配置yaml文件&#xff0c;但是对于yaml文件是如何输入到模型里&#xff0c;模型如何将yaml文件解析出来的确是不知道的&#xff0c;下面我们从yaml文件来讲解&a…

C语言同时在一行声明指针和整型变量

如果这么写&#xff0c; int *f, g; 并没有声明2个指针&#xff0c;编译器自己会识别&#xff0c;f是一个指针&#xff0c;g是一个整型变量&#xff1b; void CTszbView::OnDraw(CDC* pDC) {CTszbDoc* pDoc GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for nat…