Swagger UI: explode = true игнорируется для массива объектов в теле запроса - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь использовать Swagger для документирования вызова API POST, который имеет параметр массива объектов. Но когда я пытаюсь проверить это в Swagger UI, кажется, что explode: true игнорируется в encoding:filters. Это мой код:

openapi: 3.0.2
info:
  description: >-
    My API
  version: 1.0.0
  title: My API
tags:
  - name: myApi
    description: my API
paths:
  /myApi/getList:
    post:
      tags:
        - myApi
      summary: gets a list
      description: gets a list
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded:
            schema:
              type: object
              properties:
                sourceId:
                  type: integer
                  description: the source id
               filters:
                  type: array
                  items:
                    $ref: '#/components/schemas/Filter'
            encoding:
              filters:
                contentType: application/json
                explode: true
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string
        '500':
          description: error
components:
  schemas:
    Filter: 
      type: object
      properties:
        field:
          type: string
          description: the name of the field for this filter
        selection:
          type: array
          items:
            type: string
            description: the name of a selected value of the filter field
      required: [attribUniqueName, selection]

Если я использую в качестве параметров, например,

sourceId: 1

filters: [
  {
    "field": "product",
    "selection": ["Prod A", "Prod B"]
  },
  {
    "field": "country",
    "selection": ["USA", "France"]
  }
]

, то Swagger UI генерирует вызов, используя (если я опускаю кодировку URL для лучшей читаемости):

sourceId=1&filters={"field":"product","selection":["Prod A","Prod B"]},{"field":"country","selection":["USA","France"]}

Как заставить его производить

sourceId=1&filters={"field":"product","selection":["Prod A","Prod B"]}&filters={"field":"country","selection":["USA","France"]}

вместо?

Документация OpenAPI 3.0.2 для "Объекта кодирования" гласит, что свойство explode «ДОЛЖНО быть проигнорировано, если тип носителя тела запроса не является application / x- www-form-urlencoded.» Но здесь мы используем application / x- www-form-urlencoded. Или документация неправильная, и в ней должно быть указано «тип содержимого текущий объект» вместо «тип носителя тела запроса»? Но тогда я бы предположил получить реальный массив в качестве значения параметра, то есть

sourceId=1&filters=[{"field":"product","selection":["Prod A","Prod B"]},{"field":"country","selection":["USA","France"]}]

Если это имеет значение: я использую Swagger UI версии 3.24.3.

1 Ответ

1 голос
/ 06 февраля 2020

Ваш код выглядит хорошо, реальная проблема в том, что encoding еще не поддерживается Swagger UI .

См. здесь для получения информации о проблеме на Github. В нем есть пример для массива строк, а не для массива объектов, как в вашем случае, но, вероятно, до тех пор, пока он не работает для строк, он также не будет работать для объектов.

...