当前位置: 首页 > 知识库问答 >
问题:

Swagger中的重复参数输出

弓明亮
2023-03-14

更新:我开始怀疑这是否是由于错误:

https://github.com/domaindrivendev/Swashbuckle/issues/590

但这里提出的解决办法似乎并没有解决我的问题。

我正在使用SwashBuckle为C#ASP.NETWeb API项目生成API留档。

我的目标是允许以下作为有效URL:

/endpoint/items/123/foo?param2=bar

其中必需参数(param1)设置为“foo ”,可选参数(param2)设置为“bar”。我希望两个参数都包含在一个C#参数对象中。(带有其他可选参数,如param3等)。几个endpoint将使用相同的参数,我希望有一个单一的对象代表参数。

Swagger/Swashuckle的细节大多是一个黑匣子,我无法弄清楚。我在参数列表中得到重复。

重现问题的示例代码:

    // This endpoint is generating documentation the way I would like.
    [HttpGet]
    [Route("endpoint1/items/{id}/{param1}")]
    public string GetDataForParameters(int id, string param1, string param2 = null, string param3 = null)
    {
        return string.Format("Params: {1}, {2}, {3}", id, param1, param2, param3);
    }

    // This endpoint has the structure I would like, but I get duplicates for param1 in the documentation.
    [HttpGet]
    [Route("endpoint2/items/{id}/{param1}")]
    public string GetDataForParameters(int id, [FromUri(Name = "")]MyParams myParams)
    {
        return string.Format("Params: {1}, {2}, {3}", id, myParams.Param1, myParams.Param2, myParams.Param3);
    }

    public class MyParams
    {
        public string Param1 { get; set;}
        public string Param2 { get; set;}
        public string Param3 { get; set;}
    }

使用第二种方法,我接收单个对象中的参数。但是斯瓦格显示了“参数1”的重复条目。

屏幕截图:Swagger 重复参数

如何使Swagger/Swashblock不显示“param1”的第二个条目?

使用这种结构的原因是我有多个返回不同类型数据的endpoint,但它们使用通用参数。一些参数是必需的(以及ID的prt),因此我们希望在URL中包含这些参数,在查询字符串中包含可选参数。我更希望通用参数对象应该包括必需和可选参数。

使用Visual Studio 2015更新创建的示例代码1.默认ASP.NETWeb API项目。将上面的代码添加到生成的ValuesController.cs.已安装包Swashuckle 5.3.1依赖项。

共有2个答案

姬英耀
2023-03-14

当Swashuckle生成它的swagger.json文件时,它会查看路由和查询参数,因此当您使用Get(string参数1, string参数2...)自动告诉Swashuckle这些参数是必需的(因为它们没有设置为=null

当使用Get([FromUri(Name = "")]MyParams myParams)Swashuckle在模型中查找数据注释(System.ComponentModel.DataAnnotations)时,告诉阉羊是否需要参数。

将参数1设置为必需

public class MyParams
    {
        [Required]
        public string Param1 { get; set;}
        public string Param2 { get; set;}
        public string Param3 { get; set;}
    }
阚砚文
2023-03-14

更新:找到了一个解决方法。很难看:

  1. 在方法中引入显式重复参数
  2. 将JsonIgnore属性添加到参数对象中的重复属性

然后Swagger将拾取方法参数并为这个留档。ASP.Net将参数分配给方法参数和参数对象,允许代码使用参数对象。

    /// <param name="param1">URL parameters must be documented on this level.</param>
    [HttpGet]
    [Route("endpoint2/items/{id}/{param1}")]
    public string GetDataForParameters(int id, string param1, [FromUri(Name = "")]MyParams myParams)
    {
        // the param1 method parameter is a dummy, and not used anywhere.
        return string.Format("Params: {1}, {2}, {3}", id, myParams.Param1, myParams.Param2, myParams.Param3);
    }

    public class MyParams
    {
        /// <summary>
        /// Cannot add documentation here, it will be ignored.
        /// </summary>
        [JsonIgnore]
        public string Param1 { get; set;}
        /// <summary>
        /// This is included. Querystring parameters can be documented in this class.
        /// </summary>
        public string Param2 { get; set;}
        public string Param3 { get; set;}
    }

我不会使用这种方法,对于任何其他阅读代码的开发人员来说,这太令人困惑了。所以不幸的是,Swagger/Swashbuckle实际上迫使我更改我的(完全工作的)代码以生成文档。

除非有人能提出合适的解决方案,否则我认为最好的解决方案是使用简单的方法参数。

 类似资料:
  • 在我的python-flask应用程序中,我将https://github.com/rochacbruno/flasgger用于swagger。我需要在参数值中发送一个字典(或json)数组。但是我在swagger的文档(https://swagger . io/docs/specification/2-0/descripting-parameters/)中找不到任何这样的类型。对于用户如何实现这

  • 下面的两个查询给出了一些输出, 我不了解工作流程。它是如何输出的。谁能帮我解释一下吗。

  • 问题内容: 使用第三方API,我观察到以下内容。 而不是使用 它使用类似 我得到分配的“输出”字符串。 我很好奇实现这种功能的原因。使用此类输出参数的优点是什么? 问题答案: 在您的示例中有不对的地方。 在上面的程序中,将输出字符串“ foo”, 而不是 “ Hello World”。 某些类型是可变的,在这种情况下,您可以修改传递给函数的对象。对于不可变的类型(例如),您必须构建某种包装类,而可

  • 我在写我的招摇文件时遇到了问题。当我描述一个参数时,这个参数的$ref的描述重载了这个描述(参见下面的示例)。 结果:描述过载 谁能帮我渡过难关吗?

  • 我是新的反应,我有一个问题,如何获得另一个组件的onclick值。

  • 我如何在从下面的API生成的swagger中定义属性的默认值? Swashbuckle生成OrderDirection作为所需参数。我希望它是可选的,并向客户机指示默认值(不确定swagger是否支持此选项)。 我不喜欢使属性类型为空。还有其他选择吗?理想情况下使用内置类... 我用的是虚张声势的皮带扣。AspNetCore-https://docs.microsoft.com/en-us/asp