web-dev-qa-db-ja.com

Swagger 2.0で複数のモデルの配列を定義する

これはSwaggerへの私の最初の進出なので、優しくしてください。

次の定義があります。

definitions:
  Payload:
    type: object
    properties:
      indicators:
        type: array
        items:
          $ref: '#/definitions/Indicator'
  Indicator:
    type: object
    properties:
      type:
        type: string
      computeOn:
        type: array
        items:
          type: string
        default:
          - close
      parameters:
        type: object
  BBANDS:
    properties:
      type:
        type: string
        default: BBANDS
      computeOn:
        type: array
        items:
          type: string
        default:
          - close
      parameters:
        type: object
        properties:
          timeperiod:
            type: integer
            format: int32
            default: 5
          nbdevup:
            type: integer
            format: int32
            default: 2
          nbdevdn:
            type: integer
            format: int32
            default: 2
          matype:
            type: integer
            format: int32
            default: 0
  DEMA:
    properties:
      type:
        type: string
        default: DEMA
      computeOn:
        type: array
        items:
          type: string
        default:
          - close
      parameters:
        type: object
        properties:
          timeperiod:
            type: integer
            format: int32
            default: 5

Payloadには、indicatorsの配列であるIndicatorというプロパティがあります。 BBANDSDEMAは、typeIndicator(これは知っている ' t Swaggerに変換します)。私がやりたいのは、デフォルトで実際のモデルの配列を定義することです。この場合はBBANDSDEMAです。このようなもの:

definitions:
  Payload:
    type: object
    properties:
      indicators:
        type: array
        items:
          - '#/definitions/BBANDS'
          - '#/definitions/DEMA'

または

definitions:
  Payload:
    type: object
    properties:
      indicators:
        type: array
        items:
          - $ref '#/definitions/BBANDS'
          - $ref '#/definitions/DEMA'

もちろん、どちらも機能しません。その理由は、Indicatorモデルがindicatorを正しく記述している間、異なるindicatorsが異なるパラメーターセットを持つことができるからです。

いくつかのモデルのリストを本質的に定義する方法や、おそらくBBANDSおよびDEMAモデルをIndicatorにマップする方法はありますか?

編集:Swaggerエディターで@Helenの最初の提案を使用した結果

enter image description here

11
Jason Strimpel

Swagger/OpenAPI 2.0はitemsの複数のタイプをサポートしていませんが、必要なものを記述する方法がいくつかあります。

オプション1-モデルの継承

モデル間で共通の1つのフィールドがあり、それらを区別するために使用できる限り、モデルの継承を使用できます。

https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#schemaDiscriminatorhttps://github.com/OAI/OpenAPI-Specification/ blob/master/versions/2.0.md#composition-and-inheritance-polymorphism

あなたの例では、このプロパティはtypetype="BBANDS"またはtype="DEMA")。だからあなたはできる:

  • BBANDSを使用して、DEMAからIndicatorおよびallOfモデルを継承します。
  • 追加 discriminator: typeIndicatorに変換して、typeプロパティを使用してサブモデルを区別することを示します。
  • PayloadIndicatorの配列として定義します。この方法では、実際にはBBANDSの配列またはDEMAの配列になります。
definitions:
  Payload:
    type: object
    properties:
      indicators:
        type: array
        items:
          $ref: '#/definitions/Indicator'

  Indicator:
    type: object
    properties:
      type:
        type: string
        # Limit the possible values if needed
        #enum:
        #  - BBANDS
        #  - DEMA
      computeOn:
        type: array
        items:
          type: string
        default:
          - close

    # The "type" property will be used to distinguish between the sub-models.
    # The value of the "type" property MUST be the schema name, that is, "BBANDS" or "DEMA".
    # (Or in other words, the sub-model schema names must match possible values of "type".)
    discriminator: type
    required:
      - type

  BBANDS:
    allOf:
      - $ref: '#/definitions/Indicator'
      - type: object
        properties:
          parameters:
            type: object
            properties:
              timeperiod:
                type: integer
                format: int32
                default: 5
              nbdevup:
                type: integer
                format: int32
                default: 2
              nbdevdn:
                type: integer
                format: int32
                default: 2
              matype:
                type: integer
                format: int32
                default: 0
  DEMA:
    allOf:
      - $ref: '#/definitions/Indicator'
      - type: object
        properties:
          parameters:
            type: object
            properties:
              timeperiod:
                type: integer
                format: int32
                default: 5

オプション2-単一モデル

すべてのparametersが整数の場合、Indicatorがハッシュマップとして定義された単一のモデルparametersを持つことができます。ただし、この場合、特定のインジケータータイプに対して正確なparametersを定義する機能が失われます。

definitions:
  Indicator:
    type: object
    properties:
      type:
        type: string
        enum:
          - BBANDS
          - DEMA
      computeOn:
        type: array
        items:
          type: string
        default:
          - close
      parameters:
        type: object
        properties:
          # This is a common parameter in both BBANDS and DEMA
          timeperiod:
            type: integer
            format: int32
            default: 5
        # This will match additional parameters "nbdevup", "nbdevdn", "matype" in BBANDS
        additionalProperties:
          type: integer
9
Helen