2014-09-11 47 views
2

我想描述一個API,它有一些字段,允許不同的方式在POST一個項目時定義值,但只以某種特定方式在字段中輸出。JSON Hyper-Schema:GET和POST的不同模式

例如,我可能想描述一個API,其中可以像這樣創建或更新一個項目:{"name": "Task", "due": "2014-12-31"}或者像這樣:{"name": "Task", "due": {"$date": 1419984000000}},但它只能以第一種方式從API返回。

的POST/PUT架構因此可以:

{ 
    "type": "object" 
    "properties": { 
     "name": { 
      "type": "string" 
     }, 
     "due": { 
      "oneOf": [ 
       { 
        "type": "string", 
        "format": "date" 
       }, 
       { 
        "type": "object", 
        "properties": { 
         "$date": { 
          "type": "number" 
         } 
        }, 
        "required": ["$date"], 
        "additionalProperties": false 
       } 
      ] 
     } 
    } 
} 

儘管架構通過GET訪問就會簡單得多:

{ 
    "type": "object" 
    "properties": { 
     "name": { 
      "type": "string" 
     }, 
     "due": { 
      "type": "string", 
      "format": "date" 
     } 
    } 
} 

這將是很好的API的消費者知道他們只需要考慮一種可能的輸出方法,而不是所有的方法。

是否有任何可接受的標準方法來指定JSON超架構上下文中的不同架構?我想過通過"links"屬性來指定這些差異,但我不知道我會在什麼下定義這些模式,它看起來非常不標準。

回答

3

如果我理解正確,並且您希望爲每個操作指定一個模式,那麼可以使用標準超模式來完成。讓我們來看一個後期操作的示例:

{ 
    "description": "create an item.", 
    "href": "/items", 
    "method": "POST", 
    "rel": "create", 
    "schema": { 
    "$ref": "#/api/createitem" 
    }, 
    "title": "Create an item" 
} 

所需的實際模式通過「$ ref」在「模式」屬性中引用。

如果您還想描述響應類型,那麼您可以使用「targetSchema」屬性。請注意,這只是建議(因爲它是explained in the docs

+0

正確,但是這個('「create」')僅用於創建一個項目,不用於更新一個和'「更新」不在標準中。 – lyschoening 2014-09-11 19:25:38

+0

更新不是有效的關係類型。請看看下面的RFC:http://www.rfc-editor.org/rfc/rfc5988.txt我認爲你正在將關係類型與CRUD操作相混淆。看起來你需要「rel」:「self」和「href」:「{id}」或其他標識將要更新的資源的URI。 – jruizaranguren 2014-09-11 20:59:51

+0

我想標準關係會是[「編輯」](http://tools.ietf.org/html/rfc5023#section-11.1),即使那個也很模糊。如果「rel」:「self」可能會重複兩次(我不確定是否可以),可能會出現正常的「method」:「GET」,另一個用「POST」方法更新。 – lyschoening 2014-09-12 09:27:17