在线文档生成:Swagger

news2024/11/29 8:02:38

1 简介

        现在的项目开发都是前后端分离,前端和后端是两拨人在开发,所以这就涉及到前后端人员的接口交互了。如果使用自己维护的接口文档或口口相传的话,很容易出现接口更新不及时的问题。这个时候就需要像Swagger这样的在线文档生成框架出马了。更新接口信息并重新部署后,接口文档也会随之更新,同时Swagger也支持在线的接口调试功能。


2 简单使用

        首先需要引入的依赖如下所示:

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
</dependency>

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

        另外需要提一下的是,我的Spring Boot的版本是2.7.16,不同Spring Boot和Swagger的版本,实现会有所差异。        

        配置文件需要加上下面的配置项,否则启动会报错:

spring.mvc.pathmatch.matching-strategy=ant_path_matcher

        配置类的代码如下:

@Configuration
@EnableSwagger2
public class Swagger2Config {

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.swagger.swaggerdemo.controller"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("用户API")
                .description("用户API")
                .termsOfServiceUrl("")
                .contact(new Contact("天瑕", "", "<185@qq.com>"))
                .version("1.0")
                .build();
    }
}

        用户Controller层:

@RestController
@RequestMapping(value = "user", produces = MediaType.APPLICATION_JSON_VALUE)
@Api(tags = {"用户相关api接口"})
public class UserController {

    @GetMapping("list")
    @ApiOperation(value = "用户列表", httpMethod = "GET")
    public Result<List<UserRes>> list() {
        UserRes userRes1 = new UserRes(1L, "Hou", 1, "18500000000", "185@qq.com");
        UserRes userRes2 = new UserRes(2L, "Zhang", 0, "13400000000", "134@qq.com");
        UserRes userRes3 = new UserRes(3L, "Li", 0, "12300000000", "123@qq.com");
        List<UserRes> userResList = Lists.newArrayList(userRes1, userRes2, userRes3);
        return Result.ofSuccess(userResList);
    }

    @GetMapping("get/{id}")
    @ApiOperation(value = "用户信息", httpMethod = "GET")
    public Result<UserRes> get(@PathVariable("id") @ApiParam(name = "id", required = true, example = "1") Long id) {
        UserRes userRes1 = new UserRes(1L, "Hou", 1, "18500000000", "185@qq.com");
        return Result.ofSuccess(userRes1);
    }
}

        Controller类上需要加上@Api注解,每个方法上需要加上@ApiOperation注解。并且如果有入参和出参的话,需要加上相应的Swagger注解(而这也是Swagger一直所被人诟病的一点,侵入性太强)。

        出参UserRes的代码如下所示:

@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("用户")
public class UserRes implements Serializable {

    private static final long serialVersionUID = 5488579168437533031L;

    @ApiModelProperty(value = "用户id", required = true, position = 1, example = "1")
    private Long id;

    @ApiModelProperty(value = "名称", required = true, position = 2, example = "天瑕")
    private String name;

    @ApiModelProperty(value = "性别 1:男0:女", required = true, position = 3, example = "1")
    private Integer gender;

    @ApiModelProperty(value = "手机号", required = true, position = 4, example = "18500000000")
    private String mobile;

    @ApiModelProperty(value = "邮箱", required = true, position = 5, example = "185@qq.com")
    private String email;
}

        启动项目,页面地址输入http://localhost:8080/swagger-ui.html,查看其结果:

        最上面是项目及作者信息,中间是接口信息,最下面是模型信息。点击用户信息接口,查看接口详情:

 下面的“Model”按钮可以查看参数的信息:

2.1 在线调试        

        而右边的“Try it out”按钮可以在线调试接口:

2.2 环境配置

        在实际的项目开发中,只有开发和测试环境才能使用Swagger生成在线文档,在生产环境中是禁用Swagger的。那么这个应该怎么实现呢?我们可以使用Swagger的配置开关enable:

@Configuration
@EnableSwagger2
public class Swagger2Config {

    @Bean
    public Docket createRestApi(Environment environment) {
        Profiles of = Profiles.of("dev", "stage");
        boolean b = environment.acceptsProfiles(of);
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .enable(b)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.swagger.swaggerdemo.controller"))
                .paths(PathSelectors.any())
                .build();
    }

    //...
}

        也可以使用Spring的@Profile注解实现:

@Configuration
@EnableSwagger2
@Profile({"dev", "stage"})
public class Swagger2Config {

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.swagger.swaggerdemo.controller"))
                .paths(PathSelectors.any())
                .build();
    }

    //...
}

        这里限制了只有dev和stage环境才能开启Swagger,而在配置文件中,我们设置当前环境为prd:

spring.profiles.active=prd

        查看页面:

        可以看到,prd环境下是不能打开Swagger在线文档的,而在dev和stage环境下是可以的,实现了我们的需求。

2.3 添加请求头

        在实际的项目开发中,我们还会在Swagger的接口文档中,添加默认的请求头,比如token等信息。这个时候就可以在配置类中使用globalOperationParameters配置项:

@Configuration
@EnableSwagger2
@Profile({"dev", "stage"})
public class Swagger2Config {

    @Bean
    public Docket createRestApi() {
        Parameter parameter = new ParameterBuilder()
                .name("sessionId")
                .description("会话ID")
                .modelRef(new ModelRef("string"))
                .parameterType("header")
                .required(false)
                .build();
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .globalOperationParameters(Lists.newArrayList(parameter))
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.swagger.swaggerdemo.controller"))
                .paths(PathSelectors.any())
                .build();
    }

    //...
}

        再次打开页面,查看在线调试功能。可以看到,多了一个sessionId的输入项:

       最后我们修改一下Controller层的接口,打印一下获取到的token信息:

@GetMapping("list")
@ApiOperation(value = "用户列表", httpMethod = "GET")
public Result<List<UserRes>> list(@RequestHeader(value = "token", required = false) String token) {
    log.info("token:{}", token);
    UserRes userRes1 = new UserRes(1L, "Hou", 1, "18500000000", "185@qq.com");
    UserRes userRes2 = new UserRes(2L, "Zhang", 0, "13400000000", "134@qq.com");
    UserRes userRes3 = new UserRes(3L, "Li", 0, "12300000000", "123@qq.com");
    List<UserRes> userResList = Lists.newArrayList(userRes1, userRes2, userRes3);
    return Result.ofSuccess(userResList);
}

        在线调用一下用户列表接口,可以在控制台中看到token信息已经传过来了,于是就可以实现接口的权限验证了:

2023-09-30 12:51:00.709  INFO 23020 --- [nio-8080-exec-8] c.s.s.controller.UserController          : token:12345

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

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

相关文章

300元左右的耳机哪个性价比最好、好用的开放式耳机推荐

作为经常使用蓝牙耳机的小伙伴们而言&#xff0c;入耳式耳机戴久了会带来不舒适的感觉&#xff0c;开放式耳机显然是最舒服的选择&#xff0c;不入耳不会产生异物感&#xff0c;在户外运动可以时刻保持与外界连接更安全&#xff0c;也不会因为耳塞的卫生问题造成耳道感染&#…

嵌入式学习笔记(35)外部中断

6.9.1什么是外部中断 (1)内部中断就是指中断源来自于SoC内部&#xff08;一般是内部外设&#xff09;&#xff0c;譬如串口、定时器等部件产生的中断&#xff1b;外部中断是SoC外部的设备&#xff0c;通过外部中断对应的GPIO引脚产生的中断。 (2)按键在SoC中就使用了外部中断…

【MySQL】数据类型(二)

文章目录 一. char字符串类型二. varchar字符串类型2.1 char和varchar比较 三. 日期和时间类型四. enum和set类型4.1 set的查询 结束语 一. char字符串类型 char (L) 固定长度字符串 L是可以存储的长度&#xff0c;单位是字符&#xff0c;最大长度是255 MySQL中的字符&#xff…

No159.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

Kafka(一)使用Docker Compose安装单机Kafka以及Kafka UI

文章目录 Kafka中涉及到的术语Kafka镜像选择Kafka UI镜像选择Docker Compose文件Kafka配置项说明KRaft vs Zookeeper和KRaft有关的配置关于Controller和Broker的概念解释Listener的各种配置 Kafka UI配置项说明 测试Kafka集群Docker Compose示例配置 Kafka中涉及到的术语 对于…

基于SpringBoot的美发门店管理系统

目录 前言 一、技术栈 二、系统功能介绍 美容项目管理 产品库存管理 产品购买管理 会员卡管理 项目预定管理 产品购买信息 会员充值管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信…

笔试强训Day8

链接&#xff1a;求最小公倍数__牛客网 T1:求最小公倍数 正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值&#xff0c;设计一个算法&#xff0c;求输入A和B的最小公倍数。 数据范围&#xff1a;1≤a,b≤100000 #include<iostream> using namespace…

第四章 c数组

数组的概念 若干个相同类型的变量在内存中有序存储的集合。 数组在内存中是连续存储的。 数组的分类 按元素的类型分类 char a[10]; short a[10]; int a[10]; long int a[10]; int *a[10]; struct stu boy[10];按维度分类 int a[10]; int b[1][2]; int c[1][2][3]; int d[…

win10打开VMware 16 pro里面的虚拟机就蓝屏怎么办

2023年9月30日&#xff0c;周六下午 今天下午我也遇到了这个问题&#xff0c;后来解决了&#xff0c;于是记录一下我的解决办法 目录 1、打开控制面板&#xff0c;并选择“程序和功能” 2、点击“启动或关闭Windows服务” 3、勾选两个服务 4、重启电脑&#xff0c;大功告成…

博弈论中静态博弈经典场景案例

博弈论中静态博弈经典场景案例 1、齐威王田忌赛马 田忌赛马是中国家喻户晓的故事&#xff0c;故事讲述的是齐国大将田忌的谋士孙膑如何运用计谋帮助田忌在与齐威王赛马时以弱胜强的故事&#xff0c;这个故事其实本质也是一个博弈的过程。     齐威王要和田忌赛马&#xff…

LongLoRA:不需要大量计算资源的情况下增强了预训练语言模型的上下文能力

麻省理工学院和香港中文大学推出了LongLoRA&#xff0c;这是一种革命性的微调方法&#xff0c;可以在不需要大量计算资源的情况下提高大量预训练语言模型的上下文能力。 LongLoRA是一种新方法&#xff0c;它使改进大型语言计算机程序变得更容易&#xff0c;成本更低。训练LLM往…

2023-09-30 LeetCode每日一题(全部开花的最早一天)

2023-03-29每日一题 一、题目编号 2136. 全部开花的最早一天二、题目链接 点击跳转到题目位置 三、题目描述 你有 n 枚花的种子。每枚种子必须先种下&#xff0c;才能开始生长、开花。播种需要时间&#xff0c;种子的生长也是如此。给你两个下标从 0 开始的整数数组 plant…

【每日一题】全部开花的最早一天

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;贪心排序 写在最后 Tag 【贪心】【排序】【数组】【2023-09-30】 题目来源 2136. 全部开花的最早一天 题目解读 每一朵花需要先种下种子才会生长、开花。种种子需要花一些时间&#xff0c;生长也需要一些时间。每天只…

26973-2011 空气源热泵辅助的太阳能热水系统 储水箱容积大于0.6m3 技术规范

声明 本文是学习GB-T 26973-2011 空气源热泵辅助的太阳能热水系统 储水箱容积大于0.6m3 技术规范. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了空气源热泵辅助的太阳能热水系统的定义、符号和单位、组成与分类、设计要求、技术…

excel筛选后求和

需要对excel先筛选&#xff0c;后对“完成数量”进行求和。初始表格如下&#xff1a; 一、选中表内任意单元格&#xff0c;按ctrlshiftL&#xff0c;开启筛选 二、根据“部门”筛选&#xff0c;比如选择“一班” 筛选完毕后&#xff0c;选中上图单元格&#xff0c;然后按alt后&…

PyQt/PySide ImportError: DLL load failed while importing Shiboken,PyQt库和python

最近在测试PySide项目&#xff0c;在新环境下报错了&#xff1a;ImportError: DLL load failed while importing Shiboken: 找不到指定的程序。 Traceback (most recent call last):File "D:/xxx.py", line 10, in <module>from PySide6.QtWidgets import QAp…

excel中将一个sheet表根据条件分成多个sheet表

有如下excel表&#xff0c;要求&#xff1a;按月份将每月的情况放在一个sheet中。 目测有6个月&#xff0c;就应该有6个sheet&#xff0c;每个sheet中体现本月的情况。 一、首先增加一个辅助列&#xff0c;月份&#xff0c;使用month函数即可。 填充此列所有。然后复制【月份】…

基于微信小程序的网络安全科普题库答题系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

数据集笔记:旧金山共享单车OD数据

数据地址&#xff1a;System Data | Bay Wheels | Lyft

嵌入式学习笔记(38)什么是PWM

PWM&#xff08;pulse width modulation 脉宽调制&#xff09; (2)PWM波形是一个周期性波形&#xff0c;周期为T&#xff0c;在每个周期内波形是完全相同的。每个周期由一个高电平和低电平组成。 (3)PWM波形有2个重要参数&#xff1a;一个是周期T&#xff0c;另一个是占空比d…