允许swagger查询参数是string或整数的数组
在使用swagger2(openAPI)构buildrestapi时,我想允许查询参数station_id支持以下内容:
- station_id = 23(返回工作站23)
- station_id = 23,45(返回工作站23和45)
- ?station_id = [3:14](返回工作站3到14)
- ?station_id = 100%(%s充当通配符,因此返回像1001,10049等东西。)
我使用下面的swagger定义(string数组)作为尝试完成此操作:
parameters: - name: station_id in: query description: filter stations by station_id required: false type: array items: type: string
有了这个定义,所有的前面的例子工作,除了station_id = 23作为swaggervalidation失败与以下消息:
{ "message": "Validation errors", "errors": [ { "code": "INVALID_REQUEST_PARAMETER", "errors": [ { "code": "INVALID_TYPE", "params": [ "array", "integer" ], "message": "Expected type array but found type integer", "path": [], "description": "filter stations by station_id" } ], "in": "query", "message": "Invalid parameter (station_id): Value failed JSON Schema validation", "name": "station_id", "path": [ "paths", "/stations", "get", "parameters", "0" ] } ] }
请注意,如果我引用station_id,就像?station_id = '23'validation通过,并且我得到了正确的回应。 但我真的不喜欢用引号。 像联盟types的东西可以帮助解决这个问题,但据我所知,他们不被支持。
我也有另一个endpoint / stations / {id},可以处理单个id的情况,但仍然有许多其他(非主键)数字字段,我想以上面指定的方式进行过滤。 比如station_latitude。
任何想法来解决 – 也许我可以使用模式(正则expression式)莫名其妙吗? 如果在swagger定义中没有解决方法,是否有一种方法来调整或绕过validation器? 这是一个使用swagger-node的nodejs项目我将swagger-express-mw的版本升级到了0.7.0。
我认为你需要的是一个anyOf
关键字,类似于JSON模式提供的关键字,这样你可以定义你的station_id
参数的types是一个数字还是一个string。 这不是由swagger支持: https : //github.com/OAI/OpenAPI-Specification/issues/57 。
作为替代,也许你可以添加sortBy
, skip
,并limit
参数,让你保持types统一。 例如: ?sortBy=station_id&skip=10&limit=10
将仅检索站点10 – 20。