swagger OpenAPI:一个参数的条件模式取决于另一个参数的值

c3frrgcw  于 2023-10-18  发布在  其他
关注(0)|答案(1)|浏览(125)

我有一个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规范。
你知道怎么做吗?

mzsu5hc0

mzsu5hc01#

你可以使用discriminator继承--discriminator是一个只读字段,它告诉你层次结构中对象的类型,这可能是你的“模式”。https://swagger.io/docs/specification/data-models/inheritance-and-polymorphism/
以下三个模式为您的情况建模:VariantWithStringOrInt有一个只读的mode字段,它被限制为AB,并且存在一个字段value,它是stringint,这取决于mode的值。

components:
  schemas:
    VariantWithInt:
      required:
        - mode
        - value
      type: object
      properties:
        value:
          type: integer
          format: int64
        mode:
          type: string
          readOnly: true
    VariantWithString:
      required:
        - mode
        - value
      type: object
      properties:
        value:
          type: string
        mode:
          type: string
          readOnly: true
    VariantWithStringOrInt:
      discriminator:
        propertyName: mode
        mapping:
          A: VariantWithString
          B: VariantWithInt
      oneOf:
        - $ref: '#/components/schemas/VariantWithString'
        - $ref: '#/components/schemas/VariantWithInt'
      properties:
        someCommonProp:
          type: string
        anotherCommonProp:
          type: string

这将编译成什么当然取决于你的生成器和语言,所以要确保它编译成对所有涉及的项目都有用的东西。
例如,在openapi-generator-6.6.0 for java中,它编译为一个接口VariantWithStringOrInt,该接口公开了一个getMode方法和两个实现该接口的类:VariantWithIntVariantWithString。它们将所有字段作为属性,包括公共字段。如果你能克服你需要的显式强制转换,似乎没问题。

相关问题