Swagger 2: использовать ссылку enum в параметре запроса типа массива

Не могу понять, как использовать ссылку строкового типа со значениями перечисления в параметре массива. Я могу сделать ссылку в ключе items, и он работает, но Swagger выдает ошибку: недопустимое определение параметра

Веб-интерфейс генерирует интерфейс, но у него есть текстовое поле вместо поля множественного выбора, как я ожидал.

Как правильно это делать?

Мой код:

    swagger: '2.0':
    paths:
      /test:
        get:
          parameters:
          - in: origin
            name: status
            description: Origin
            required: false
            schema:
              type: array
              items:
                $ref: '#/definitions/Origin'
            collectionFormat: pipes'
    definitions:
      Origin:
        type: string
        description: Campaign origin
        enum:
          - one
          - two
    externalDocs:
      description: Find out more about Swagger
      url: http://swagger.io
    host: virtserver.swaggerhub.com
    basePath: /

person DeusModus    schedule 13.01.2017    source источник


Ответы (2)


Параметры массива с items, содержащим $ref, являются не поддерживается в OpenAPI / Swagger 2.0. Но похоже, что это станет возможным в следующей версии 3.0. На данный момент есть несколько обходных путей, см. Ниже.

В вашей спецификации также есть некоторые другие проблемы:

  • in: origin недействителен. Ключевое слово in указывает расположение параметра ( путь, запрос, заголовок и т. д.) и принимает только определенные значения в соответствии со спецификацией OpenAPI / Swagger. Я полагаю, вы имели в виду in: query или in: header.

  • Опечатки (или ошибки копирования-вставки?): swagger: '2.0': имеет лишний : в конце, а collectionFormat: pipes' имеет лишний ' в конце.


Одним из решений для параметра массива, содержащего значения перечисления, является определение встроенного перечисления:

      parameters:
        - in: query
          name: status
          description: Origin
          required: false
          type: array
          collectionFormat: pipes
          items:
            type: string
            enum:
              - one
              - two

Другое решение (найдено здесь) - использовать якоря YAML для ссылка на перечисление. Это особенность YAML, где вы можете пометить ключ с помощью &anchor-name, а затем использовать *anchor-name для ссылки на значение этого ключа.

definitions:
  Origin:
    type: string
    description: Campaign origin
    enum: &origin
      - one
      - two

paths:
  /test:
    get:
      parameters:
        - in: query
          name: status
          description: Origin
          required: false
          type: array
          collectionFormat: pipes
          items:
            type: string
            enum: *origin
person Helen    schedule 13.01.2017
comment
У меня такая же проблема. Swagger.json, созданный проектом, возвращает ту же ошибку, поскольку items имеет $ ref. Не могли бы вы мне помочь, как удалить $ ref и добавить enum в c #? Проект является чистым ядром 3.1. - person Nainesh Patel; 29.07.2020

Один из вариантов - определить параметр и сделать ссылку на него: (У меня возникла проблема с использованием ссылки ($ ref :) в определении запроса)

paths:
  /path:
    get:
      operationId: controllers.controller
      parameters:
        **- $ref: '#/parameters/SPEC'**


parameters:
  SPEC:
person user3712978    schedule 29.10.2019