首页 > 解决方案 > ASP.Net Core Swagger 如何忽略默认参数值

问题描述

有没有办法“抑制” SwaggerUI 为可选参数预先选择默认值的方式?我们仍然希望这些参数包含在生成的文档中,只是没有选择值。这是它在 SwaggerUI 2.x 中的工作方式,但看起来 3.x 不再是这种情况

编辑 - 添加示例以澄清我的问题。

例如 - 假设您有以下端点:

[HttpGet]
public dynamic GetSomething(
     string filter1, 
     string filter2, 
     bool shouldIFilter = false, 
     SomeEnum enumValue = SomeEnum.Whatever)

在 swagger 中,当您单击“试用”时,shouldIFilterenumValue输入字段将具有已选择的方法签名中指定的默认值。相反,我希望这些字段没有选择任何值,以便在单击执行时它们不包含在查询中。

基本上,请求 url 应该是这样的:http ://some.url.com/v3/search?filter1=afilter&filter2=anotherfilter

(没有 &shouldIFilter=false&enumValue=Whatever)

--- 编辑:2019 年 5 月 20 日 ---

在下面接受 Helder 的建议时,我尝试注入 js 来处理这个问题。我发现的第一件事是,在单击“试用”按钮之前,输入字段不存在。而这个按钮是不存在的,直到您展开列表中的特定操作!?!但是,在将元素添加到 DOM 时连接观察者以设置我想要的值后,我能够成功更改所选值。

但是当您单击执行时,这些值会刷新以匹配原始规范 - 我的 js 不会再次触发以更改我希望它们成为的值。

我开始认为这可能是不可能的。虽然我在想我可能会尝试创建一个 SwaggerUI 插件,它可能能够做到这一点——但我也不预计会有很大的成功。

其他人有什么想法吗?

标签: asp.net-coreswaggerswagger-uiswashbuckle

解决方案


为了结束这个循环,我想分享我最终为解决这个问题所做的事情(尽管我们还没有决定是否真的要继续前进)。

由于使用 React 的 Swagger UI 3.x,尝试注入 JS 最终太麻烦了——我能够在 UI 中更改特定参数的选定值,但是一旦您单击“执行”,它们就会“重置”回来为默认值。

相反,我最终添加了一个 IParameterFilter 来更改参数默认值,并确保每个参数都被正确记录以显示默认值是什么

public void Apply(OpenApiParameter parameter, ParameterFilterContext context)
{
   if (parameter.In != ParameterLocation.Query) return;

   // readonly list to limit which parameters have this applied
   if (_parametersToUnSet.Contains(parameter.Name))
   {
       parameter.Description = $"*Default value*: {parameter.Schema.Default}";
       parameter.Schema.Default = null;
   }
 }

推荐阅读