我目前正在为现有的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