C# Swagger UI 全局路由参数配置:能否统一注入userId参数?
在Swagger中配置全局通用路由参数自动注入
当然可以实现,针对你提到的~/user/{userId:guid}/...这类共享路由参数的场景,有两种实用方案:
方案一:后端通过Swashbuckle OperationFilter标记全局参数
如果用的是ASP.NET Core的Swashbuckle,可以自定义IOperationFilter来自动识别包含{userId:guid}的路由,给对应的接口参数添加全局配置标记,让Swagger UI识别为可全局设置的参数。
- 自定义OperationFilter:
public class GlobalRouteParameterFilter : IOperationFilter { public void Apply(OpenApiOperation operation, OperationFilterContext context) { var routeTemplate = context.ApiDescription.ActionDescriptor.AttributeRouteInfo?.Template; // 检查路由模板是否包含目标参数 if (routeTemplate?.Contains("{userId:guid}") == true) { var userIdParam = operation.Parameters.FirstOrDefault(p => p.Name == "userId" && p.In == ParameterLocation.Path); if (userIdParam != null) { // 添加扩展标记,让Swagger UI识别为全局参数 userIdParam.Extensions.Add("x-ms-parameter-location", new OpenApiString("global")); userIdParam.Description = "全局用户ID,设置后自动填充到所有含该参数的路由"; } } } }
- 注册这个Filter到Swagger服务:
builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" }); // 添加自定义Filter c.OperationFilter<GlobalRouteParameterFilter>(); });
方案二:前端脚本实现全局输入自动填充
如果需要更灵活的UI控制,可以给Swagger UI注入自定义JavaScript,添加一个全局输入框,输入userId后自动填充所有对应路由的参数输入框。
- 配置Swagger UI注入脚本:
app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"); // 注入自定义脚本(确保脚本文件在wwwroot/swagger-ui目录下) c.InjectJavascript("/swagger-ui/custom-script.js"); });
- 编写
custom-script.js:
window.onload = () => { // 在Swagger顶部导航栏添加全局输入框 const topBar = document.querySelector('.swagger-ui .topbar-wrapper'); const userIdInput = document.createElement('input'); userIdInput.type = 'text'; userIdInput.placeholder = '全局用户ID(GUID)'; userIdInput.style.marginLeft = '10px'; userIdInput.style.padding = '4px 8px'; userIdInput.style.borderRadius = '4px'; userIdInput.style.border = '1px solid #ccc'; // 输入内容时自动填充所有userId参数输入框 userIdInput.addEventListener('input', (e) => { const value = e.target.value.trim(); document.querySelectorAll('.parameter__input[name="userId"]').forEach(input => { input.value = value; // 触发输入事件,让Swagger UI更新请求URL input.dispatchEvent(new Event('input')); }); }); topBar.appendChild(userIdInput); };
两种方案可以结合使用:后端Filter标记参数用途,前端脚本实现自动填充,彻底避免重复输入。
内容的提问来源于stack exchange,提问作者Heinrich
相关产品推荐
相关产品推荐

