Я использую 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 . Пробовал это, и, похоже, он работает.