我目前正在为现有的PHP应用程序设计API,为此,我正在研究REST作为一种明智的体系结构方法。
我相信我对关键概念有一个合理的了解,但是我正在努力寻找能够解决对象层次结构和REST的人。
这是问题所在...
在[应用程序]业务对象层次结构中,我们有:
Users
L which have one-to-many Channel objects
L which have one-to-many Member objects
在应用程序本身中,我们使用延迟加载方法根据需要用这些对象的数组填充User对象。我相信用面向对象的术语讲,这是对象聚合,但是我已经看到了各种命名不一致的问题,并且不关心就精确命名约定发动战争。
现在,考虑一下我有一些松散耦合的对象,这些对象可能会/可能不会填充,这取决于应用程序的需求。
从REST的角度来看,我正在尝试确定应采用的方法。这是我目前的想法(暂时仅考虑GET):
选项1-完全填充对象:
GET api.example.com/user/{user_id}
读取User对象(资源),并返回带有所有可能的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
/ channels调用将以以下形式返回频道资源列表:
api.example.com/channel/{channel_id}
优点:主要资源公开了获取子目录的位置,而不是子目录(更RESTful?),不需要先要求下级,下级列表生成器(/ channels和/ members)提供了接口(类似方法)响应更多的服务喜欢。
缺点:现在需要三个调用才能完全填充对象
选项4-(重新)考虑REST的对象设计
我正在重用[现有的]应用程序对象层次结构,并尝试将其应用于REST-或更直接地,为其提供API接口。
也许REST对象的层次结构应该有所不同,或者新的RESTful思想正在暴露现有对象设计的局限性。
对以上任何想法表示欢迎。
非常感谢
保罗