SpringBoot进阶详解SpringBoot中使用Swa
在上篇文章中我们介绍了SpringBoot整合Swagger3。0的一些基础用法,这篇文章中我们来深入学习一下Swagger3。0还有其他高级用法。
在日常的开发中,为了减少工作量,我们会遇到一种情况,就是将前端的接口与后端的接口编写到同一个代码中,这样也提高了代码的复用率,减少了重复开发代码的工作量。这个时候我们就需要将接口文档也进行拆分。分为前端接口和后端接口两个部分。
在Swagger3。0中如何进行接口分组呢?Swagger3。0接口分组操作
通过之前的例子我们知道,我们往容器中注入一个Docket就是注入了一个文档,其中我们设置了groupName的分组名称。要想注入多个文档,意思就是需要往容器中注入多个Docket。既然是这样,我们就需要修改之前的Swagger的配置文件,将其改为如下的代码。EnableOpenApiConfigurationEnableConfigurationProperties(value{SwaggerProperties。class})publicclassSwagger3Config{AutowiredprivateSwaggerPropertiesswaggerProperties;BeanpublicDocketfrontApi(){returnnewDocket(DocumentationType。OAS30)是否开启,根据环境配置。enable(swaggerProperties。getFront()。getEnable())。groupName(swaggerProperties。getFront()。getGroupName())。apiInfo(frontApiInfo())。select()。apis(RequestHandlerSelectors。basePackage(swaggerProperties。getFront()。getBasePackege()))。paths(PathSelectors。any())。build();}前台API信息privateApiInfofrontApiInfo(){returnnewApiInfoBuilder()。title(swaggerProperties。getFront()。getTitle())。description(swaggerProperties。getFront()。getDescription())。version(swaggerProperties。getFront()。getVersion())。contact(添加开发者信息newContact(swaggerProperties。getFront()。getContactName(),swaggerProperties。getFront()。getContactUrl(),swaggerProperties。getFront()。getContactEmail()))。build();}BeanpublicDocketbackApi(){returnnewDocket(DocumentationType。OAS30)是否开启,根据环境配置。enable(swaggerProperties。getBack()。getEnable())。groupName(swaggerProperties。getBack()。getGroupName())。apiInfo(backApiInfo())。select()。apis(RequestHandlerSelectors。basePackage(swaggerProperties。getBack()。getBasePackege()))。paths(PathSelectors。any())。build();}前台API信息privateApiInfobackApiInfo(){returnnewApiInfoBuilder()。title(swaggerProperties。getBack()。getTitle())。description(swaggerProperties。getBack()。getDescription())。version(swaggerProperties。getBack()。getVersion())。contact(添加开发者信息newContact(swaggerProperties。getBack()。getContactName(),swaggerProperties。getBack()。getContactUrl(),swaggerProperties。getBack()。getContactEmail()))。build();}}
我们会看到在这个配置类中注入了两个Docket,分别代表前端的接口和后端的接口,那么在配置文件中如何进行配置呢?
首先我们先来看一下其配置类,代码如下DataConfigurationProperties(prefixspring。swagger3)publicclassSwaggerProperties{privateSwaggerEntityfront;privateSwaggerEntityback;DatapublicstaticclassSwaggerEntity{privateStringgroupName;privateStringbasePackege;privateStringtitle;privateStringdescription;privateStringcontactName;privateStringcontactEmail;privateStringcontactUrl;privateStringversion;privateBooleanenable;}}
全局配置类spring:swagger3:front:enable:truegroupName:前端接口basePackege:com。example。demo。controller。apititle:前端测试接口description:前端测试SpringBoot整合Swagger3。0contactName:nihuicontactEmail:18202504057163。comcontactUrl:https:blog。csdn。netnihui123version:0。0。1back:enable:truegroupName:后端接口basePackege:com。example。demo。controller。webtitle:后端测试接口description:后端测试SpringBoot整合Swagger3。0contactName:nihuicontactEmail:18202504057163。comcontactUrl:https:blog。csdn。netnihui123version:0。0。1mvc:pathmatch:matchingstrategy:antpathmatcher
通过上面的配置完成配置之后,就会看到在接口页面会有两个分组,一个是前端接口、一个是后端接口分组。
添加授权认证信息
在很多对外提供服务的API接口中,都会有一个授权认证的操作,否则这些接口是无法进行调用的。例如在一般的情况下,会在接口中包含一个TOKEN参数。
那么在Swagger3。0中如何对这个认证信息进行配置,这样在每次请求的时候都会带着这个参数进行请求,这样就避免了我们在测试过程中,每次都需要添加这个信息的麻烦。
要完成授权信息的添加,我们需要在Docket方法中添加如下的内容ConfigurationpublicclassBaseSwagger3Config{AutowiredprivateBaseSwagger3Propertiesproperties;BeanpublicDocketbaseApi(){returnnewDocket(DocumentationType。OAS30)是否开启,根据环境配置。enable(properties。getEnable())。groupName(properties。getGroupName())。apiInfo(frontApiInfo())。select()。apis(RequestHandlerSelectors。basePackage(properties。getBasePackege()))。paths(PathSelectors。any())。build()。securitySchemes(securitySchemes())。securityContexts(securityContexts());}privateListSecuritySchemesecuritySchemes(){ApiKeyapiKeynewApiKey(TOKEN,token,In。HEADER。toValue());returnCollections。singletonList(apiKey);}privateListSecurityContextsecurityContexts(){returnCollections。singletonList(SecurityContext。builder()。securityReferences(Collections。singletonList(newSecurityReference(TOKEN,newAuthorizationScope〔〕{newAuthorizationScope(global,)})))。build());}前台API信息privateApiInfofrontApiInfo(){returnnewApiInfoBuilder()。title(properties。getTitle())。description(properties。getDescription())。version(properties。getVersion())。contact(添加开发者信息newContact(properties。getContactName(),properties。getContactUrl(),properties。getContactEmail()))。build();}}
完成上述配置之后,会看到在接口页面上会多出一个认证的按钮。通过这个认证的按钮我们可以设置对应的参数值
添加公共参数
在不同的平台使用的时候,除了携带请求Token之外还会有一些用户进行用户分析,大数据分析的参数被传到请求中。那么如何在Swagger3。0中去定义这些公共参数呢?这个时候我们需要在配置代码中添加如下的内容。ConfigurationpublicclassBaseSwagger3Config{AutowiredprivateBaseSwagger3Propertiesproperties;BeanpublicDocketbaseApi(){RequestParameterrequestParameternewRequestParameterBuilder()。name(clientType)。description(客户端类型)。in(ParameterType。HEADER)。required(true)。build();创建一个请求参数集合ListRequestParameterrequestParameterListCollections。singletonList(requestParameter);returnnewDocket(DocumentationType。OAS30)是否开启,根据环境配置。enable(properties。getEnable())。groupName(properties。getGroupName())。apiInfo(frontApiInfo())。select()。apis(RequestHandlerSelectors。basePackage(properties。getBasePackege()))。paths(PathSelectors。any())。build()。globalRequestParameters(requestParameterList)。securitySchemes(securitySchemes())。securityContexts(securityContexts());}privateListSecuritySchemesecuritySchemes(){ApiKeyapiKeynewApiKey(TOKEN,token,In。HEADER。toValue());returnCollections。singletonList(apiKey);}privateListSecurityContextsecurityContexts(){returnCollections。singletonList(SecurityContext。builder()。securityReferences(Collections。singletonList(newSecurityReference(TOKEN,newAuthorizationScope〔〕{newAuthorizationScope(global,)})))。build());}前台API信息privateApiInfofrontApiInfo(){returnnewApiInfoBuilder()。title(properties。getTitle())。description(properties。getDescription())。version(properties。getVersion())。contact(添加开发者信息newContact(properties。getContactName(),properties。getContactUrl(),properties。getContactEmail()))。build();}}
会看到上述代码中通过,RequestParameter定义了一个公共的参数,并且将其放入到了一个参数集合中,通过Docket的。globalRequestParameters(requestParameterList)方法将其添加到Swagger3。0文档中。然后运行项目会看到在接口中就会携带这对应的参数出现,并且这个参数是全局的,也就是说每个接口中都需要有这一个参数。
到这里,Swagger的相关内容就告一段落了。细心的读者会发现,在前面我们添加分组配置的时候在配置类上添加了好多的注解,但是在我们演示认证信息与全局参数的时候,配置类中只是简单的添加了一个Configuration注解。这是为什么呢?下面我们就来探索一下源码。OpenApiAutoConfiguration源码
会看到在这段源码中,好像什么功能都没实现,但是它确完成了Swagger3。0大多数的配置,而对于EnableOpenApi注解来讲。ConfigurationEnableConfigurationProperties(SpringfoxConfigurationProperties。class)ConditionalOnProperty(valuespringfox。documentation。enabled,havingValuetrue,matchIfMissingtrue)Import({OpenApiDocumentationConfiguration。class,SpringDataRestConfiguration。class,BeanValidatorPluginsConfiguration。class,Swagger2DocumentationConfiguration。class,SwaggerUiWebFluxConfiguration。class,SwaggerUiWebMvcConfiguration。class})AutoConfigureAfter({WebMvcAutoConfiguration。class,JacksonAutoConfiguration。class,HttpMessageConvertersAutoConfiguration。class,RepositoryRestMvcAutoConfiguration。class})publicclassOpenApiAutoConfiguration{}EnableOpenApi注解
对于EnableOpenApi注解来讲其关键的代码就是Import(OpenApiDocumentationConfiguration。class)引入的还是这个类。Retention(valuejava。lang。annotation。RetentionPolicy。RUNTIME)Target(value{java。lang。annotation。ElementType。TYPE})DocumentedImport(OpenApiDocumentationConfiguration。class)publicinterfaceEnableOpenApi{}
这里我们会发现为什么在没有EnableOpenApi注解的时候也会生效呢?那就是用到了我们SpringBoot自动配置的原理了。关于自动配置的原理在后续的分析中我们来进行讲解,这里就先不做过多说明。提示大家的就是找到如下图中的代码就可以理解自动配置的原理
总结
通过上面的内容我们了解了Swagger3。0的一些扩展性的用法,当然Swagger的用法远远不止这些,但是这些内容已经可以支持在我们日常开发中的一些工作。希望大家多多关注,笔者会为大家带来更多精彩干活
辽宁锦州八景是哪八景辽宁锦州八景是什么辽宁锦州市风景秀丽,在锦州的名胜风景也有很多,锦州过去的确有八景一说,但随着葫芦岛升格市地级市之后,划归于葫芦岛市。八景是明朝的时候总结的,有八个景点。……
走了马蓉来了冯清,新女友黑料不断,王宝强到底喜欢她什么?自从爆出新女友冯清之后,就时常传出冯清与王宝强两人做了婚前财产公正,准备领证结婚的消息。可正式官宣恋情都没有的二人,这就要结婚的节奏了?而在爆出两人在一起后,前妻马……
内娱男明星可以全体向吴磊白敬亭他们学习吗?广大男明星,能不能想吴磊一样卷起来,练一下臂力。最近《星汉灿烂》正在热播中,广大网友都这磕吴磊扮演的角色凌不疑和赵露思演的程少商的CP,影视有好多个画面吴磊都轻轻松松一把……
新能源车有4个弊端,看完你还想买吗?推荐语:近年来,新能源汽车行业不断受到国家重视,随着相关鼓励政策的出台,极大推动中国新能源汽车行业的发展。官方数据显示:2021年中国新能源汽车销量为352万辆,中国汽车……
风靡世界的大富翁,发明的初衷是为了反对垄断大富翁发明的初衷却并不是鼓励人们成为资本寡头,恰恰相反是为了反对当时的大垄断者。大宇资讯最近真的是动作连连,在发布了《仙剑客栈》的续作《仙剑客栈2》后,又在Steam炒了……
A股机器人才是未来!未来有望翻倍的5大细分龙头股(附名单)机器人的市场规模在下游需求和zc扶持的带动作用下,中国已经是并将继续保持全球第一大机器人市场的地位。20192021年国内工业机器人出货量从14。9万台增长至25。6万台……
上半年中国智能手机销量出炉荣耀暴涨118。3苹果第三【手机中国新闻】2022年手机似乎有些卖不动了,今年第二季度的手机市场更是惨淡,销量未及2016年第四季度创下的历史峰值销量的一半。7月28日,CINNOResearch发布的……
井冈山午后。小睡起来,用新买的青花瓷,泡一杯刚刚网购的龙井。淡淡的轻烟,从茶杯里升腾缭绕飘渺的惬意,并在空气中弥漫出优雅的茶香。窗外,太阳明丽灿烂,充满详和氛围。虽是八月盛夏,却没有……
服装箱包平台招商发展中服装箱包平台以一站式商务的创新服务理念,实现多种形式的信息交互,提供全面的行业信息和市场信息,先进科学技术为主导,专业性服务为一体的新一代电子商务专业平台。以便捷的浏览方式,强……
达科为IPO上半年卖出2145多万支核酸采样管(文张志峰编辑马媛媛)在排队约1年后,科研试剂厂商深圳市达科为生物技术股份有限公司(下称达科为)最终成功过会。10月中旬,达科为正式向证监会提交招股说明书,冲刺深交所IP……
美甲分享丨雨后天晴今日宜做美甲一场秋雨一场寒日子忽然缓慢而悠长街边卖糖炒栗子的小店开始排起长队秋天的气息我们也要做秋天的美甲啦01hr冰透雾霾蓝渐变延长美甲清冷感很足……
聚会夜跑看日出白云山夜游成年轻人新宠你见过凌晨时分的白云山吗?对于很多广州年轻人来说,凌晨时分的白云山并不陌生。随着白云山环境越来越靓,配套设施越来越完善,如今每晚都有一批年轻人涌入白云山:他们有的在山间夜跑,有……