我正在用openapi 3.0.1定义一个查询参数,如下
{
"name" : "sort",
"in" : "query",
"description" : "Sorting criteria. Example: productCode,desc",
"required" : false,
"explode" : false,
"schema" : {
"type" : "array",
"items" : {
"type" : "string"
}
}
}
在swagger ui 3.51.1上,如果我添加两个字符串
"parameter1,asc"
"parameter2,desc"
它们被正确地序列化(作为一个包含2个元素的字符串列表(,但如果我只添加一个字符串
"parameter1,asc"
它将被错误地序列化为具有2个元素(parameter1
和asc
(的字符串列表。我不明白为什么绳子爆炸了!非常感谢您的帮助。
在您的示例中,查询参数没有定义style
,因此它默认为style: form
。非分解形式样式将逗号,
视为数组项的分隔符。这会导致歧义,因为数组项的值也使用逗号作为内部分隔符。
可能的解决方案包括更改后端代码和/或OpenAPI参数定义。
-
调整后端代码,使其每隔一个逗号(而不是每个逗号(拆分接收到的
sort
字符串。 -
或者,对
sort
数组使用另一种序列化方法,例如:-
explode: true
发送分解阵列:?sort=parameter1,asc&sort=parameter2,desc
-
style: pipeDelimited
+explode: false
使用|
而不是逗号分隔数组项:?sort=parameter1,asc|parameter2,desc
-
-
或者,将
sort
更改为对象/映射,而不是数组:{ "name": "sort", "in": "query", "description": "Sorting criteria. Example: productCode,desc", "required": false, "explode": false, "schema": { "type": "object", "additionalProperties": { "type": "string", "enum": ["asc", "desc"] } } }
在这种情况下,您当前的查询字符串格式
?sort=parameter1,asc,parameter2,desc
明确地对应于:
{ "parameter1": "asc", "parameter2": "desc" }