我有一个OpenAPI规范,它包含以下内容:
{
"/mypath" : {
"get": {
...
"parameters" : [
{
"in": "query",
"name": "input",
"schema": {
"type": ###### Problem here #######
}
},
{
"in": "query",
"name": "mode",
"schema": {
"type": "string",
"enum": [
"modeA",
"modeB"
]
}
}
]
}
}
}
我的问题是:如果mode
参数的值是modeA
,我想使input
参数的type
成为integer
,如果mode
参数的值是modeB
,则string
。
我尝试了使用if-then-else结构,但我不知道如何引用parameters
数组中的两个参数。
我的第二种方法是使用oneOf
,
"get": {
...
"oneOf": [
{
"parameters" : [
{
"in": "query",
"name": "input",
"schema": {
"type": "integer"
}
},
{
"in": "query",
"name": "mode",
"const": "modeA"
}
},
{
"parameters" : [
{
"in": "query",
"name": "input",
"schema": {
"type": "string"
}
},
{
"in": "query",
"name": "mode",
"const": "modeB"
}
}
]
}
但对我来说,它看起来不像一个有效的OpenAPI规范。
你知道怎么做吗?
1条答案
按热度按时间mzsu5hc01#
你可以使用
discriminator
继承--discriminator
是一个只读字段,它告诉你层次结构中对象的类型,这可能是你的“模式”。https://swagger.io/docs/specification/data-models/inheritance-and-polymorphism/以下三个模式为您的情况建模:
VariantWithStringOrInt
有一个只读的mode
字段,它被限制为A
或B
,并且存在一个字段value
,它是string
或int
,这取决于mode
的值。这将编译成什么当然取决于你的生成器和语言,所以要确保它编译成对所有涉及的项目都有用的东西。
例如,在openapi-generator-6.6.0 for java中,它编译为一个接口
VariantWithStringOrInt
,该接口公开了一个getMode
方法和两个实现该接口的类:VariantWithInt
和VariantWithString
。它们将所有字段作为属性,包括公共字段。如果你能克服你需要的显式强制转换,似乎没问题。