我目前正在爲現有的PHP應用程序設計API,爲此我正在研究REST作爲一種明智的架構方法。我應該如何處理RESTful API中的對象層次結構?
我相信我對關鍵概念有一個合理的把握,但我正在努力尋找解決了對象層次結構和REST的人。
這裏的問題...
在[應用]業務對象的層次結構,我們有:
Users
L which have one-to-many Channel objects
L which have one-to-many Member objects
在應用程序本身,我們使用延遲加載的方式來填充的陣列的用戶對象這些對象根據需要。我相信OO術語這是對象聚合,但是我看到了各種命名不一致的情況,並且不關心開始一場關於精確命名約定的戰爭。
現在,請考慮我有一些鬆散耦合的對象,根據應用程序的需要,我可能會/可能不會填充這些對象。
從REST的角度來看,我試圖確定該方法應該是什麼。這是我目前的想法(只考慮GET暫時):
選項1 - 完全填充的對象:
GET api.example.com/user/{user_id}
閱讀用戶對象(資源),並與所有返回的用戶對象預先加載和編碼的可能的Channel和Member對象(JSON或XML)。
優點:減少的對象的數目,沒有對象層次的遍歷需要
缺點:對象必須完全填充(昂貴的)
選項2 - 填充主對象和包括鏈接到其他對象資源:
GET api.example.com/user/{user_id}
閱讀用戶對象(資源),並返回填充用戶對象的用戶數據和兩個列表。
每個列表引用相應(子)資源即
api.example.com/channel/{channel_id}
api.example.com/member/{member_id}
我認爲這是接近(或精確地)超媒體的影響 - 只要客戶能得到其他資源,如果它想(我明智地標記他們)。
優點:客戶可以選擇加載下屬或以其他方式,如REST資源的對象的更好的分離
缺點:獲得二次資源
方案3需要進一步的行程 - 使遞歸檢索
GET api.example.com/user/{user_id}
閱讀用戶對象幷包含指向子對象列表的鏈接即
api.example.com/user/{user_id}/channels
api.example.com/user/{user_id}/members
的/頻道呼叫將在形式返回信道資源的列表(如上):
api.example.com/channel/{channel_id}
優點:第一資源暴露到哪裏得到subodinates但他們不是什麼(更多RESTful?),不需要預先獲得下屬,下屬列表生成器(/通道和/成員)提供接口(方法)使響應更像服務。
缺點:現在需要充分填充物三個電話
選項4 - (重新)考慮REST
我重新使用[現行]應用對象的層次結構,並試圖對象設計將其應用於REST - 或者可能更直接地爲其提供API接口。
也許REST對象層次結構應該是不同的,或者新的RESTful思想可能會暴露現有對象設計的侷限性。
對上述任何想法都表示歡迎。
非常感謝
保羅
在我搜索我也發現了這組文章,我發現非常有用的和可訪問:http://www.infoq.com/minibooks/emag-03-2010-rest – paulkmoore 2010-10-06 10:18:38
如果你正在尋找一個所有這些樣式基於JSON的媒體類型,考慮商事:http://www.aminus.org/rbre/shoji/shoji-draft-02.txt – fumanchu 2010-10-06 17:45:46