Параметр строки запроса в документации swagger не отправлен как массив в запросе - PullRequest
1 голос
/ 24 сентября 2019

В настоящее время я работаю над проектом, использующим Symfony 4.3.4 и Платформа API v2.3.6 .

Я столкнулся с 1 проблемой прямо сейчас.Допустим, я отправляю запрос GET в enpoint с параметром строки запроса под названием products , потому что я отправляю 1 или более идентификаторов продукта.

Я хочу получить значение параметра products в моем контроллере в виде PHP-массива .

Так что мой запрос

GET /my/endpoint?products[]=8f391c60-5467-4bf0-917f-e2151337fa7e&products[]=ddaa94e1-af79-4abf-9dfc-a28dd8077f45

В контроллере я выполняю дамп:

dump($request->query->get("products"));

Тогда я получаю:

array:2 [
  0 => "8f391c60-5467-4bf0-917f-e2151337fa7e"
  1 => "ddaa94e1-af79-4abf-9dfc-a28dd8077f45"
]

Как вы можете видеть, как я прохожуидентификаторы продуктов, такие как массив в строке запроса, я могу получить параметр products как массив PHP .Мое беспокойство здесь - документирование.Использование этой конфигурации в YAML:

collectionOperations:
    operation_name:
        method: get
        path: /my/endpoint
        controller: App\Controller\MyEndpointController
        swagger_context:
            summary: My summary
            description:
                My endpoint description
            responses:
                parameters:
                    -
                        in: query
                        name: products
                        description: "The products IDs parameter"
                        schema:
                            type: array
                            items:
                                type: "string"
                                example: "019fcd9b-beea-4791-8a59-d4e2d02427d6"

На странице документации API, когда я выбираю Попробуйте Я должен заполнить все значения параметров, включенные products .Проблема в том, что параметр products отображается как текстовый ввод .

Если я удаляю ключ schema в конфигурации yaml параметра, а я помещаю type: array иitems непосредственно на том же уровне, что и in, name и description:

parameters:
    -
        in: query
        name: products
        description: "The products IDs parameter"
        type: array
        items:
            type: "string"
            example: "019fcd9b-beea-4791-8a59-d4e2d02427d6"

Затем появляется параметр products с кнопкой Add item.Каждый раз, когда я нажимаю на эту кнопку, я могу заполнить идентификатор продукта для передачи, и это нормально.Проблема в том, что когда я нажимаю на Выполнить (все еще на странице документации API), у меня возникает ошибка, потому что платформа API не отправляет запрос с параметром products в виде истинного массива, а в виде строки, содержащей все идентификаторы продукта, разделенные ,:

GET /my/endpoint?products=8f391c60-5467-4bf0-917f-e2151337fa7e,ddaa94e1-af79-4abf-9dfc-a28dd8077f45

и вот что я хочу:

GET /my/endpoint?products[]=8f391c60-5467-4bf0-917f-e2151337fa7e&products[]=ddaa94e1-af79-4abf-9dfc-a28dd8077f45

есть идеи о том, как добиться этого с помощью платформы API?

1 Ответ

1 голос
/ 24 сентября 2019

Параметр запроса должен иметь имя products[] (в квадратных скобках) и иметь атрибут collectionFormat: multi:

parameters:
  - in: query
    name: products[]
    type: array
    items:
      type: string
      format: uuid
    collectionFormat: multi
    # (Optional) Array example to display in Swagger UI
    x-example:
      - 8f391c60-5467-4bf0-917f-e2151337fa7e
      - ddaa94e1-af79-4abf-9dfc-a28dd8077f45

Обратите внимание, что параметры запроса в OpenAPI2.0 не поддерживают ключевое слово example, но некоторые инструменты (например, Swagger UI) поддерживают расширение x-example для указания значений примеров для параметров запроса.

...