允许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 。

作为替代,也许你可以添加sortByskip ,并limit参数,让你保持types统一。 例如: ?sortBy=station_id&skip=10&limit=10将仅检索站点10 – 20。