一、前言🔥
👨🎓作者:bug菌
💌公众号:猿圈奇妙屋
🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。
🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。
哈喽,小伙伴们,我是bug菌呀👀,不知不觉就一年又4月,正是踏青郊游的好时节。可上海疫情,除了在家远程办公就是看点技术顺便卷点文章。这不是4月又出了更文活动,逼自己一把,坚持每天做点内容输出,养成写作习惯,将来你会回来感谢曾经的自己坚持了一把才有此刻的辉煌成就。
小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐️+关注👨🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻♀️,掘金不停💕,加油☘️
二、背景🔥
说起swagger,很多小伙伴肯定都对swagger都并不陌生,一个超级好用的集成在项目里的postman,但对于一般接口测试来说,是非常简便的。
常规都是body参数体,别的也不会用到。然而,对于一些非"常"操作,就显得不是那么的熟悉使用了,但是基本了解了它所提供的api,你也能改它的源码,但是我今天要说的是既不要你熟悉它的的实现源码也不用额外学习其他技术,只需要看我写的,我就能教懂你今天的主题,"如何给swagger请求时能附带自定义的请求头?"。
这个需求很常见吧,比如你的登录,如果是用token认证,那肯定会做的一件事就是每一次http请求都会要求前端在请求时请求头附带token令牌,对不对,这也是业务系统常用的登录拦截功能。今天我就拿这个例子来说,具体如何写,非常之简单。
三、解决方案🔥
集成过swagger 的小伙伴,肯定都会在自己的项目中配置一下SwaggerConfig.java,缺它,你的swagger也运行不了,对吧。
那么跟swagger添加自定义请求头有啥联系?别着急,继续往下看。
我们都知道,body参数是自带的,要如果要添加header参数呢?那就要你手动添加啦,你只需要在注入该globalOperationParameters(),这是一个全局参数配置,你只需要将你设置的header 参数名设置进去即可。
我们先来看下 globalOperationParameters() 方法加在哪里。
/** * swagger文档配置 */ @Bean public Docket customDocket() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("com.example.review.controller")) .paths(PathSelectors.any()) .build() .globalOperationParameters();// 全局配置 }
接着你既可以在当前类中把你要设置的header参数传进去,我是单独封装了一个添加参数的内置方法,这样好处就是代码不会造成过长。
/** * 添加head参数配置 */ private List<Parameter> getParameterList() { ParameterBuilder clientIdTicket = new ParameterBuilder(); List<Parameter> pars = new ArrayList<Parameter>(); clientIdTicket.name(Constant.TOKEN_HERDER_KEY).description("token令牌") .modelRef(new ModelRef("string")) .parameterType("header") .required(false).build(); //设置false,表示clientId参数 非必填,可传可不传! pars.add(clientIdTicket.build()); return pars; }
假如你要添加多个header 请求头参数,那你就再new 一个 ParameterBuilder()类,然后一样的设置,在pars集合中将你参数build后add进去即可。Constant是我定义的一个常量类,这个你们若是不习惯直接定义字符串命名也可。
最后一步就是将此刻封装的header 头传入到全局配置方法中。
.globalOperationParameters(this.getParameterList());
大家能看的明白不?若不能,我再把swagger配置全部粘贴到下边,大家好好的连串解读一下,基本看完我说的,你们下一次若是遇到再header添加自定义请求头的话,直接怼它,这我未出生就会了。
如下是完整swagger 配置。
package com.example.review.config; import com.example.review.util.Constant; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.ParameterBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.schema.ModelRef; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.Contact; import springfox.documentation.service.Parameter; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; import java.util.ArrayList; import java.util.List; /** * swagger配置 * * @Author * @Date 2021-06-01 13:00 */ @Configuration //必须存在 @EnableSwagger2 //必须存在 public class SwaggerConfig { /** * swagger文档配置 */ @Bean public Docket customDocket() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("com.example.review.controller")) .paths(PathSelectors.any()) .build() .globalOperationParameters(this.getParameterList());// 全局配置 } /** * 添加head参数配置 */ private List<Parameter> getParameterList() { ParameterBuilder clientIdTicket = new ParameterBuilder(); List<Parameter> pars = new ArrayList<Parameter>(); clientIdTicket.name(Constant.TOKEN_HERDER_KEY).description("token令牌") .modelRef(new ModelRef("string")) .parameterType("header") .required(false).build(); //设置false,表示clientId参数 非必填,可传可不传! pars.add(clientIdTicket.build()); return pars; } /** * api相关配置 */ private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("swagger 接口文档") .contact(new Contact("review", "", "")) .description("swagger-bootstrap-ui") .termsOfServiceUrl("http://localhost:8888/") .version("1.0") .build(); } }
四、测试🔥
配置后,重启下项目刷新一下swagger 访问链接。诺,这不加的header类型就出来了么。是不是很简单,直接配置也就不需要所有人都跑去postman进行接口测试了。
... ...
ok,以上这样就好啦,如果还想学习更多,你可以看看我的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬的。好啦,咱们下期见~
五、往期推荐🔥
- 如何使用Mybatis-plus实现字段内容的自动填充?不会我就教你。
- Springboot系列(十六):集成easypoi实现word模板内循环导出多数据
- Springboot系列(十六):集成easypoi实现word模板图片导出
- Springboot系列(十六):集成easypoi实现excel多sheet表导入
- Springboot系列(十六):集成easypoi实现excel多sheet表导出
六、文末🔥
如果还想要学习更多,小伙伴们可关注bug菌专门为大家创建的专栏《SpringBoot零基础入门》,从无到有,从零到一!希望能帮到大家。
我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!