2016-12-21 97 views
4

在使用swagger2(OpenAPI的)構建一個REST API的陣列,我想允許查詢參數station_id支持下列:允許招搖查詢參數是字符串或者整數

  • station_id = 23(返回站23)
  • ?station_id = 23,45(返回站23和45)
  • ?station_id = [3:14](返回站3至14)
  • ?station_id = 100%(%S充當通配符如此返回像1001, 10049等的東西。)

我使用下面招搖定義(字符串數組)作爲試圖實現此目的:作爲招搖驗證失敗與

parameters: 
    - name: station_id 
    in: query 
    description: filter stations by station_id 
    required: false 
    type: array 
    items: 
     type: string 

在這個定義下,除了station_id = 23的所有的前述實施例工作的?以下消息:

{ 
    "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'驗證通過,我會得到正確的響應。但我真的不想用引號。像聯合類型的東西可以幫助解決這個問題,但據我所知,它們不被支持。

我也有另一個endpoint/stations/{id}可以處理單個id的情況,但仍然有許多其他(非主鍵)數字字段,我想按照上面指定的方式進行過濾。例如station_latitude。

任何想法,以解決 - 也許我可以使用模式(正則表達式)莫名其妙嗎?如果在swagger定義中沒有解決方法,是否有一種方法可以調整或繞過驗證器?這是一個使用swagger-node的nodejs項目我已將版本swagger-express-mw升級到0.7.0。

回答

0

我想你需要的是一個anyOf關鍵字,類似於JSON模式提供的關鍵字,以便您可以將參數station_id的類型定義爲數字或字符串。這不被swagger支持:https://github.com/OAI/OpenAPI-Specification/issues/57

作爲一種替代方案,也許您可​​以添加sortByskiplimit參數,以允許您保持類型一致。例如:?sortBy=station_id&skip=10&limit=10將只檢索10 - 20個電臺。

+1

AnyOf將在OpenAPI v3中受支持 –

相關問題