【问题标题】:Can swagger handle IEnumerable of string in Http requests?可以swagger处理Http请求中字符串的IEnumerable吗?
【发布时间】:2021-07-04 20:25:58
【问题描述】:

我对 Web 开发还很陌生,而且总的来说很招摇,所以如果这个问题太天真了,我深表歉意。

我将使用 Visual Studio 2019 中的 Asp.Net Core Web Api 模板来更好地解释我的问题,因此请考虑该环境,以防我遗漏了一些信息(或只是要求缺少的部分我会带来)。

我们有一个带有简单 GET 的 WeatherForecastController 类(我包含了 names 参数):

[HttpGet]
public IEnumerable<WeatherForecast> Get(IEnumerable<string> names)
{
    //...
}

当我尝试使用 Swagger 页面测试此请求时,它无法识别 name 参数。

我已经进行了其他测试以了解发生了什么,我发现了以下内容:

  1. Swagger 确实可以与 IEnumerable 一起使用,因为如果参数类型为 IEnumerable&lt;IFormFile&gt;(它会显示已上传文件的列表、显示文件选择对话框等),它会很好地工作;
  2. 我尝试将参数封装在 DTO 类中,它似乎破坏了更多的东西(即使IEnumerable&lt;IFormFile&gt; 似乎在 DTO 中也不起作用 em> 类;只有在[HttpVerb]方法的参数列表中直接传递才有效;
  3. 我尝试了其他类似类型以及ICollection&lt;string&gt;List&lt;string&gt;string[];它们似乎都不起作用;
  4. 使用boolint 等基本类型作为IEnumerable&lt;T&gt; 的类型参数时也会出现同样的问题;

那么发生了什么?我应该设置某种配置值以便它可以处理原始类型的集合吗?

更新显示问题的图片:

... Get(string names, IEnumerable&lt;IFormFile&gt; file):

... Get(IEnumerable&lt;string&gt; names, IFormFile file):

如您所见,当参数列表中的任何参数为 IEnumerable 时,swagger UI 不会像第二张图片那样正确显示请求的字段。

【问题讨论】:

  • 你用这个尝试了什么查询字符串?
  • @Ctznkane525 问题不在于查询字符串,问题在于使用 swagger UI 组装查询字符串,我将在一分钟内使用显示问题的打印屏幕更新问题。
  • @Ctznkane525 刚刚用 2 张图片更新了问题,显示了何时正确和何时出错。
  • 在数组参数之前添加 [FromBody] 属性。我认为 Swagger UI 在 formData 中无法正确处理数组参数。
  • @AliReza 将其封装在 DTO 类中并使用 [FromForm] 成功了,谢谢!你想把它放在答案中吗?

标签: c# swagger


【解决方案1】:

您必须在您的案例中指定模型绑定源。你的动作方法应该是这样的:

    [HttpPost("test/names")]
    public IEnumerable<string> PostNames([FromQuery]IEnumerable<string> names, IEnumerable<IFormFile> files)
    {
        //...some code
        return names;
    }

在您指定它们绑定的来源之前,您不应使用两个或更多复杂类型参数作为操作参数。这是因为复杂对象默认绑定到request body,请求体只能绑定一个参数。

截至微软文档:

不要将[FromBody] 应用于每个操作方法的多个参数。一旦请求流被输入格式化程序读取,就不能再被读取以绑定其他[FromBody] 参数。

复杂类型是指类变量、数组以及那些不是主要类型的变量,如intdoublestring 等。

Swagger 为上述操作生成此 UI:

最后,请注意,当您使用GET http 请求时,您不能在请求正文中发送任何内容。

【讨论】:

    猜你喜欢
    • 2016-08-19
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    相关资源
    最近更新 更多