Можете ли вы смешать параметры Swagger в запросе и в теле? - PullRequest
0 голосов
/ 11 октября 2019

Я получаю ошибки, когда пытаюсь это сделать, но я хотел создать конечную точку, которая принимает 2 параметра запроса и 1 элемент тела, список имен. Когда я запускаю его в подключении, но сообщаю, что это неверная спецификация.

/devices/list:
  post:
    tags: [Devices]
    operationId: app.get_devices
    summary: Gets a complete list of devices.
    parameters:
      - $ref: '#/parameters/foo-t'
      - $ref: '#/parameters/bar-t'
      - in: body
        name: device_names
        required: true
        type: array
        items:
          type: string
        description: a list of devices
...

Он компилируется и запускается без секции - in: body. Так что я знаю, что 2 параметра хороши. Кажется, у меня возникла проблема с применением отправки массива JSON в Python.

Явно возвращаемая ошибка:

connexion.exceptions.InvalidSpecification: {'in': 'body', 'name': 'device_names', 'required': True, 'type ':' array ',' items ': {' type ':' string '},' description ':' Список имен устройств '} недопустим ни для одной из указанных схем

Ошибка проверки'oneOf' в схеме ['properties'] ['paths'] ['patternProperties'] ['^ /'] ['properties'] ['post'] ['properties'] ['parameters'] ['items']: {'oneOf': [{'$ ref': '# / определений / параметр'}, {'$ ref': '# / определений / jsonReference'}]}

В пути экземпляра [''] [' / devices / list '] [' post '] [' parameters '] [2]: {' description ':' Список имен устройств ',' in ':' body ',' items ': {'type': 'string'}, 'name': 'device_names', 'required': True, 'type': 'array'}

Мое желаемое конечное состояние - это то, что я могу сказать:

//In javascript
$.post("devices/list", {device_names: ["a","b","c"]}, {params:{foo:1, bar:42}}).success( x => {
  //...
});

# In Python3
def get_devices(foo, bar, device_names):
  pass

1 Ответ

1 голос
/ 11 октября 2019

Да, вы можете смешивать параметры запроса и тела.

Ошибка вызвана неправильным синтаксисом параметра тела. Измените его так, чтобы type и items были заключены в schema, например:

      - in: body
        name: device_names
        required: true
        schema:   # <-------
          type: array
          items:
            type: string
        description: a list of devices

В OpenAPI 2.0 параметры, не связанные с телом (путь, запрос, заголовок, параметры формы), используютtype напрямую, но параметры тела должны иметь свой тип, заключенный в schema.

Приведенный выше пример соответствует телу запроса, которое содержит строковый массив, как есть - ["a", "b", "c"].

Если предполагается, что массив заключен в объект JSON

{
   "device_names": ["a", "b", "c"]
}

, вам необходимо изменитьпараметр тела выглядит следующим образом:

      - in: body
        name: device_names
        required: true
        schema:
          type: object
          required: [device_names]
          properties:
            device_names:
              type: array
              items:
                type: string
        description: a list of devices
...