Как я могу переопределить пример в спецификации openapi?

#swagger #openapi

Вопрос:

У меня есть следующие спецификации:

 ---
openapi: 3.0.0
info:
  title: Players API
  version: 0.0.1-alpha1

paths:
  /players/{id}:
    get:
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/PlayerWrapper'
components:
  schemas:
    PlayerWrapper:
      type: object
      properties:
        display_name:
          type: string
          example: 76ers
        config:
          description: |
            The configuration of the player.
          example: { spec: { team: 76ers, names: [ 1, 2 ] } }
          allOf:
            - $ref: '#/components/schemas/Player'
    Player:
      type: object
      properties:
        spec:
          allOf:
            - $ref: '#/components/schemas/BasicPlayer'
      additionalProperties: false
    BasicPlayer:
      type: object
      properties:
        team:
          type: string
        names:
          allOf:
            - $ref: '#/components/schemas/Names'
      additionalProperties: false
    Names:
      type: array
      items:
        type: string
      example: [ Ben, Joel ]
 

введите описание изображения здесь

Я действительно проверил на Суэггере, что он действительно действителен. Вопрос в том, почему я могу видеть names: [ 1, 2 ] иначе, чем [ Ben, Joel ] . Когда я удаляю эту example вещь ( # example: { spec: { team: 76ers, names: [ 1, 2 ] } } ), я могу увидеть Ben, Joel пример:
введите описание изображения здесь

Есть ли способ, как я могу принудительно переопределить / объединить эти примеры? На данный момент я чувствую, что мой пример переопределяется любым из этих полей (т. Е. Либо 76ers / [1, 2], либо строкой / [Бен, Джоэл], но вместо этого я хотел бы получить 76ers / [Бен, Джоэл]).

Ответ №1:

Структура в ваших схемах не совсем верна. Идея заключается в том, чтобы предоставить примеры простых типов (строки, int и т. Д.), И схема структурирует их по мере необходимости.

Поэтому не помещайте пример в конфигурацию, поместите его во вложенные простые типы, подобные этому, т. Е. BasicPlayer объект должен иметь example команду «включено», так как это строка:

     BasicPlayer:
      type: object
      properties:
        team:
          type: string
          example: '76ers'
        names:
          allOf:
            - $ref: '#/components/schemas/Names'
 

Аналогично с PlayerWrapper.config не пытайтесь дать полный объект в примере, он составляется из свойств элемента. Таким team образом, получается пример, но Names пример составлен из дочернего типа.

     PlayerWrapper:
      type: object
      properties:
        display_name:
          type: string
          example: '76ers'
        config:
          description: |
            The configuration of the player.
          allOf:
            - $ref: '#/components/schemas/Player'
 

Что должно дать вам ожидаемый пример:

Пример из swagger

Вот вам и вся развязность:

 ---
openapi: 3.0.0
info:
  title: Players API
  version: 0.0.1-alpha1

paths:
  /players/{id}:
    get:
      parameters: 
        - $ref: '#/components/parameters/id'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/PlayerWrapper'
components:
  parameters:
    id: 
      name: id
      in: path
      required: true
      schema:
        type: string
      description: The id.
  schemas:
    PlayerWrapper:
      type: object
      properties:
        display_name:
          type: string
          example: '76ers'
        config:
          description: |
            The configuration of the player.
          allOf:
            - $ref: '#/components/schemas/Player'
    Player:
      type: object
      properties:
        spec:
          allOf:
            - $ref: '#/components/schemas/BasicPlayer'
      additionalProperties: false
    BasicPlayer:
      type: object
      properties:
        team:
          type: string
          example: '76ers'
        names:
          allOf:
            - $ref: '#/components/schemas/Names'
      additionalProperties: false
    Names:
      type: array
      items:
        type: string
        example: 
          - Ben
          - Joel
 

Примечание. Примеры схем можно переопределить с помощью примера в определении ресурса, например:

 paths:
  /players/{id}:
    get:
      parameters: 
        - $ref: '#/components/parameters/id'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/PlayerWrapper'
              example:
                display_name: 76ers
                config:
                  spec:
                    team: 76ers
                    names:
                      - 'Ben'
                      - 'Joel'