Swagger中的参数输出重复

时间:2016-02-18 09:57:55

标签: c# asp.net asp.net-web-api swagger swashbuckle

更新: 我开始怀疑这是否是由于一个错误造成的:

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

但是解决方法表明似乎没有解决我的问题。

我正在使用Swashbuckle为C#ASP.NET Web API项目生成API文档。

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

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

将所需参数(param1)设置为" foo"和一个可选参数(param2)设置为" bar"。我希望两个参数都包含在一个C#参数对象中。 (使用其他可选参数,如param3等)。几个端点将使用相同的参数,我希望有一个表示参数的对象。

Swagger / Swashbuckle的细节大多是黑盒子,我无法弄清楚这一点。我在参数列表中得到了重复项。

重现问题的示例代码:

    // 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;}
    }

使用第二种方法,我在单个对象中接收参数。但是Swagger为" param1"。

显示了一个重复的条目

屏幕截图:Swagger duplicate parameter

如何让Swagger / Swashbuckle不显示" param1"的第二个条目?

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

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

2 个答案:

答案 0 :(得分:1)

更新: 找到了解决方法。这太丑了:

  1. 在方法中引入显式重复参数。
  2. 将JsonIgnore属性添加到参数对象中的重复属性。
  3. 然后,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在实践中强迫我改变我的(完全工作)代码以生成文档。

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

答案 1 :(得分:0)

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

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

将Param1设为必需

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