我正在使用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--
与此有关的问题是:
IEnumerable<string> tags
参数仅包含一个字符串,而不包含我期望的4个字符串鉴于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(
不幸的是,我无法直接给您解决问题,因为我不知道如何以您想要的方式编辑摇摇欲坠,但是我遇到了同样的问题。看我的帖子。也许您可以像在我的解决方法中那样使招摇的工作成为可能?
A list of GUIDs is empty when passed into a model which is used by [FromForm] in ASP.NET Core 2.2