Могу ли я использовать массивы использования swagger-php в строке запроса?

Я использую Swagger-php. Когда я определяю параметр, который находится в строке запроса, он может быть массивом. Но из того, что я вижу, он не поддерживает такой запрос:

https://api.domain.tld/v1/objects?q[]=1&q[]=5&q[]=12 

Я считаю, что это было бы установлено в поле collectionFormat если это возможно. В настоящее время я только что использовал pipes , но я хочу использовать вышеуказанный формат, и Swagger-UI тоже отражают это. Тем не менее, я прочитал этот вопрос github, который оставил меня в недоумении, действительно ли это возможно, и я просто пропустил его?

Пример моего определения Swagger-PHP:

 /** * @SWG\Parameter( * name="ids", * in="query", * description="A list of IDs (separated by pipes) to filter the Returns", * required=false, * type="array", * @SWG\Items( * type="integer", * format="int32" * ), * collectionFormat="pipes" * ) */ 

Это приводит к следующему JSON:

 "parameters": { "ids": { "name": "ids", "in": "query", "description": "A list of IDs (separated by pipes) to filter the Returns", "required": false, "type": "array", "items": { "type": "integer", "format": "int32" }, "collectionFormat": "pipes" } } 

    К сожалению, невозможно получить именно указанный вами URL ( https://api.domain.tld/v1/objects?q[]=1&q[]=5&q[]=12 ) для параметра запроса массива.

    Предполагая, что вы хотите определить 1-мерный параметр запроса массива (проблема github, на которую вы ссылаетесь, касается многомерных массивов), вот что предлагает текущая спецификация OpenAPI (fka. Swagger):

    • Если вы используете массив с форматом коллекции, подобным pipes (вы также можете использовать csv , ssv или ssv для получения разных разделителей), URL-адрес будет выглядеть так:

       https://api.domain.tld/v1/objects?q=1|5|12 

      Но это не тот синтаксис, который вы ищете: все элементы массива определены в одном параметре q запроса.

    • К счастью, есть еще один multi коллекции, позволяющий определить элемент каждого массива в своем собственном параметре q , с помощью этого вы можете почти получить то, что хотите, за вычетом [] :

       https://api.domain.tld/v1/objects?q=1&q=5&q=12 

    Вы можете прочитать об этом в этом учебнике OpenAPI (fka. Swagger) (раскрытие: я написал его) и в самой спецификации (описание ParameterObject)

     /** * @SWG\Parameter( * name="q[]", * in="query", * description="A list of IDs (separated by pipes) to filter the Returns", * required=false, * type="array", * collectionFormat="multi", * uniqueItems=true, * ) */ 

    Это приведет к чему-то подобному этому

     { "name": "q[]", "in": "query", "description": "type", "required": false, "type": "array", "collectionFormat": "multi", "uniqueItems": true } 

    Результирующее изображение

    Отказ от ответственности: im использует SwaggerUI , но это может сработать и для вас.

    Мне тоже было интересно об этом в течение некоторого времени, но я решил пройти через код js и посмотреть, могу ли я изменить / исправить его там, и я заметил эти несколько строк кода:

     if (type === 'brackets' || type === 'multi') { var bracket = type === 'brackets' ? '[]' : '' for (var i = 0; i < value.length; i++) { if (i > 0) {encoded += '&';} encoded += this.encodeQueryParam(name) + bracket + '=' + this.encodeQueryParam(value[i]); } } 

    Таким образом, кажется, что есть скобки набора CollectionFormat, которые не были определены в спецификации OpenAPI v2 . Пробовал это, и, похоже, он работает.