SpringCloud + React19 集成Scalar的API文档

📅 2026/7/8 16:19:20 👁️ 阅读次数 📝 编程学习
SpringCloud + React19 集成Scalar的API文档

你好呀,我的老朋友!我是老寇,跟我一起学习集成Scalr API文档

众所周知,Knife4j是一个集Swagger2OpenAPI3为一体的增强解决方案,但是社区不太活跃,再加上SpringBoot4发版,迫切需要一个集成OpenAPI 3.0OpenAPI 3.1规范的增强解决方案,所以才集成Scalar

React集成Scalar

React集成Scalar文档地址

安装依赖
pnpminstall@scalar/api-reference-react
配置详情
配置项类型是否必填说明示例
sourcesArrayOpenAPI 文档源列表,一个配置可以配置多个 API 文档。[{ title: "认证授权", url: "/api/v3/api-docs" }]
sources.titleStringAPI 文档名称,在 Scalar 左侧导航中显示。"认证授权"
sources.urlStringOpenAPI(Swagger)JSON 文档地址。"/api-proxy/auth/api/v3/api-docs"
sources.defaultBoolean是否默认选中该文档。true
proxyUrlStringScalar 的代理地址,用于 Try It、鉴权等请求代理。"/api-proxy/auth/scalar"
expandAllResponsesBoolean是否默认展开所有 Response。true
hideClientButtonBoolean是否隐藏 Generate Client(生成客户端)按钮。true
orderRequiredPropertiesFirstBooleanModel 属性中,是否将必填字段排在前面。true
expandAllModelSectionsBoolean是否默认展开所有 Model 定义。false
具体代码

apiDoc.tsx

import{ApiReferenceReact}from'@scalar/api-reference-react'import'@scalar/api-reference-react/style.css'import{useIntl}from'@@/exports';exportdefault()=>{constintl=useIntl();constt=(id:string,values?:Record<string,any>)=>intl.formatMessage({id},values);return(<ApiReferenceReact configuration={[{sources:[{title:'认证授权',url:"/api-proxy/auth/api/v3/api-docs",default:true,}],proxyUrl:"/api-proxy/auth/scalar",expandAllResponses:true,hideClientButton:true,orderRequiredPropertiesFirst:true,expandAllModelSections:false,},{sources:[{title:'后台管理',url:"/api-proxy/admin/api/v3/api-docs",default:true,}],proxyUrl:"/api-proxy/admin/scalar",expandAllResponses:true,hideClientButton:true,orderRequiredPropertiesFirst:true,expandAllModelSections:false,}]}/>);};

Spring Cloud Gateway集成Scalar

由于代理地址为/**/scalar因此,需要在网关层将/**/scalar覆盖为scalar_url

依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway-server-webflux</artifactId> </dependency>
具体代码

ScalarGatewayFilterFactory

@Slf4j@ComponentpublicclassScalarGatewayFilterFactoryextendsAbstractGatewayFilterFactory<ScalarGatewayFilterFactory.@NonNullConfig>implementsOrdered{publicScalarGatewayFilterFactory(){super(Config.class);}@OverridepublicintgetOrder(){returnOrdered.LOWEST_PRECEDENCE-2000;}@NonNull@OverridepublicGatewayFilterapply(Configconfig){return(exchange,chain)->{ServerHttpRequestrequest=exchange.getRequest();// 获取uriStringrequestURL=ReactiveRequestUtils.getRequestURL(request);// scalar重写地址if(ReactiveRequestUtils.pathMatcher("/**/scalar",requestURL)){StringscalarUrl=ReactiveRequestUtils.getParamValue(request,"scalar_url");URIuri=URI.create(scalarUrl);returnchain.filter(exchange.mutate().request(request.mutate().uri(uri).path(uri.getPath()).build()).build());}returnchain.filter(exchange);};}publicstaticclassConfig{}}

application.yml

spring:cloud:gateway:server:webflux:enabled:trueroutes:-id:laokou-auth-scalaruri:lb://laokou-authpredicates:-Path=/api-gateway/auth/scalarfilters:-name:Scalar-id:laokou-admin-scalaruri:lb://laokou-adminpredicates:-Path=/api-gateway/admin/scalarfilters:-name:Scalar

SpringBoot集成Scalar(以laokou-auth为例)

安装依赖
<dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-scalar</artifactId></dependency>
具体代码

OpenApiDocConfig

@ConfigurationpublicclassOpenApiDocConfig{@BeanOpenAPIopenApi(){returnnewOpenAPI().info(newInfo().title("API文档").description("API文档").version("1.0.0").contact(newContact().name("laokou").url("https://github.com/KouShenhai").email("2413176044@qq.com")).license(newLicense().name("Apache 2.0").url("https://www.apache.org/licenses/LICENSE-2.0.html"))).externalDocs(newExternalDocumentation().description("老寇IoT云平台").url("https://github.com/KouShenhai")).addSecurityItem(newSecurityRequirement().addList(HttpHeaders.AUTHORIZATION)).components(newComponents().addSecuritySchemes(HttpHeaders.AUTHORIZATION,newSecurityScheme().name(HttpHeaders.AUTHORIZATION).type(SecurityScheme.Type.OAUTH2).in(SecurityScheme.In.HEADER).scheme("Bearer").bearerFormat("JWT")));}}

application.yml

scalar:enabled:truespringdoc:swagger-ui:enabled:falseapi-docs:enabled:truepath:/v3/api-docsversion:openapi_3_1

我是老寇,我们下次再见啦!