如何设置Swashbuckle / swagger-ui以逗号分隔并在multipart / form-data请求中正确引用字符串的数组?

问题描述 投票:0回答:1

我正在使用ASP.NET Core 3.0(<TargetFramework>netcoreapp3.0</TargetFramework>)和Swashbuckle 5.0.0-rc4(<PackageReference Include="Swashbuckle.AspNetCore" Version="5.0.0-rc4" />)。

我有一个API控制器操作方法,该方法接受上载的文件(即IFormFile)以及一些元数据和标记以与POSTed文件关联:

public async Task<IActionResult> Post(
    string fileId = null, 
    IFormFile file = null, 
    [FromForm] IDictionary<string, object> metadata = null, 
    [FromForm] IEnumerable<string> tags = null)
{
    // ...
}

我很幸运–能够通过Swashbuckle / swagger-ui以似乎正确的格式发送metadata(除非,我需要写一些东西来解析JSON中的JSON多部分/表单数据片段)。 metadata参数确定。

我在使用tags参数时遇到了实际问题。 Swashbuckle生成的OpenAPI文档如下所示:

    "/projects/{projectId}/features/imports": {
      "post": {
        "tags": [
          "FeaturesImports"
        ],
        "summary": "Import features from a file uploaded by the end user, or from a file already stored in XXX",
        "parameters": [
          {
            "name": "fileId",
            "in": "query",
            "description": "The XXX File (Version) Id of the source file to import. Optional; if file is not provided, a fileIdmust be provided.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "file": {
                    "type": "string",
                    "format": "binary"
                  },
                  "metadata": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "object",
                      "additionalProperties": false
                    }
                  },
                  "tags": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                }
              },
              "encoding": {
                "file": {
                  "style": "form"
                },
                "metadata": {
                  "style": "form"
                },
                "tags": {
                  "style": "form"
                }
              }
            }
          }
        },

在我看来,我们拥有的事实:

                  "tags": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }

似乎正确:我想接收一个字符串数组。

但是,当swagger-ui呈现表单,并且最终用户输入所需数据时,提交的请求与我期望的不一样。我希望tags数据类似于:

------WebKitFormBoundaryKQWA8MEJTEXgMvsj
Content-Disposition: form-data; name="metadata"

{
  "additionalProp1": {},
  "additionalProp2": {},
  "additionalProp3": {}
}
------WebKitFormBoundaryKQWA8MEJTEXgMvsj
Content-Disposition: form-data; name="tags"

["string1","string2",",","string4\""]
------WebKitFormBoundaryKQWA8MEJTEXgMvsj--

但是]我最终得到的是:

------WebKitFormBoundaryKQWA8MEJTEXgMvsj
Content-Disposition: form-data; name="metadata"

{
  "additionalProp1": {},
  "additionalProp2": {},
  "additionalProp3": {}
}
------WebKitFormBoundaryKQWA8MEJTEXgMvsj
Content-Disposition: form-data; name="tags"

string1,string2,,string4"
------WebKitFormBoundaryKQWA8MEJTEXgMvsj--

与此有关的问题是:

  1. 当数据绑定到操作方法的参数时,IEnumerable<string> tags参数仅包含一个字符串,而不包含我期望的4个字符串
  2. 各个字符串用逗号连接;并且“原始”字符串中存在的任何逗号都不会转义。因此,不可能重建原始的预期数据
  3. 鉴于metadata参数似乎是JSON编码的,我希望tags参数也是如此。但是,OpenAPI 3.0.2规范指出(在https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#special-considerations-for-multipart-content),>

    如果属性是复数或复数数组,则默认的Content-Type为application/json

...这样就说明了metadata参数的JSON编码,以及...

如果属性是原始值或原始值数组,则默认的Content-Type为text/plain

...啊,这解释了tags参数的编码,因为它是原始值的数组。

I think的根本问题是swagger-ui尚不支持可以为多部分参数设置的“编码对象”,但是任何人都没有任何可能有用的建议,技巧,解决方法或其他想法在这里?

我正在使用ASP.NET Core 3.0(netcoreapp3.0

)和Swashbuckle 5.0.0-rc4(
asp.net-core asp.net-core-webapi swagger-ui swashbuckle
1个回答
0
投票

不幸的是,我无法直接给您解决问题,因为我不知道如何以您想要的方式编辑摇摇欲坠,但是我遇到了同样的问题。看我的帖子。也许您可以像在我的解决方法中那样使招摇的工作成为可能?

A list of GUIDs is empty when passed into a model which is used by [FromForm] in ASP.NET Core 2.2

© www.soinside.com 2019 - 2024. All rights reserved.