2015-06-17 24 views
11

我正在yaml中編寫我的swagger定義。假設我有一個像這樣的定義。如何在某些操作需要的定義中創建字段而不是其他字段

paths: 
    /payloads: 
    post: 
     summary: create a payload 
     ... 
     parameters: 
     - in: body 
     name: payload 
     description: New payload 
     required: true 
     schema: 
      $ref: "#/definitions/payload" 
    put: 
     summary: update a payload 
     ... 
     parameters: 
     - in: body 
     name: payload 
     description: Updated existing payload 
     required: true 
     schema: 
      $ref: "#/definitions/payload" 
... 
definitions: 
    payload: 
    properties: 
     id: 
     type: string 
     someProperty: 
     type: string 
     ... 

有沒有一種方法,我可以表明,需要有效載荷的id屬性爲PUT操作是可選的(或不應該出現在所有)爲POST操作?

回答

14

您將不得不單獨定義模型。

但是,您可以選擇排除和區別的情況。

如果您想要排除這種情況,請使用排除的屬性創建一個模型,例如ModelA。然後定義ModelBModelA加上附加屬性:

ModelB: 
    allOf: 
    - $ref: "#/definitions/ModelA" 
    - type: object 
     properties: 
     id: 
      type: string 

如果你正在尋找定義的差異,按照上述同樣的方法,並從ModelA排除id。然後將ModelBModelC定義爲擴展ModelA並將id屬性添加到它們,每個屬性都有其自身的限制。請注意,JSON Schema可以允許您按照上面的原始示例對某些情況進行「覆蓋」定義。但是,由於它並不是真正的重要性,並且需要更好地理解JSON模式的概念以避免發生簡單的錯誤,所以我建議現在就走這條路。

+0

這非常有用。 我會對任何有關這些「覆蓋」的進一步見解感興趣,因爲如果可能的話,我真的很想避免使用多個模型。 模式文檔似乎表明定義覆蓋可以放在方法「模式」部分,只要元素不「重複」...是否有任何這種語法的例子? – rainecc

+0

您的答案得到了賞金,因爲沒有其他選擇。但我仍然希望有現成的替代品。如果有人知道,請寫一個答案。 –

+0

相信我,我希望有。不幸的是,JSON Schema是一種驗證語言,而不是一種建模語言,因此它對這種(常見)用例並不友好。 – Ron

相關問題