我目前正在为一个现有的 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 对象(资源)并返回 User 对象,其中包含预加载和编码的所有可能的 Channel 和 Member 对象(JSON 或 XML)。
优点: 减少对象的数量,不需要遍历对象层次结构
缺点: 对象必须完全填充(代价高昂)
选项2-填充主对象并包含到其他对象资源的链接:
GET api.example.com/user/{user_id}
读取 User 对象(资源)并返回 User 对象 User 数据填充和两个列表。
每个列表引用适当的(子)资源,即。
api.example.com/channel/{channel_id}
api.example.com/member/{member_id}
我认为这与超媒体的含义非常接近(或者确切地说)——客户可以根据需要获得其他资源(只要我合理地标记它们)。
支持: 客户端可以选择加载下属或其他方式,更好地将对象分离为 REST 资源
缺点: 需要进一步的旅行才能获得备用资源
选项3-启用递归检索
GET api.example.com/user/{user_id}
阅读 User 对象并包含子对象列表的链接,即。
api.example.com/user/{user_id}/channels
api.example.com/user/{user_id}/members
通道调用将返回表单中的通道资源列表(如上所示) :
api.example.com/channel/{channel_id}
支持: 主要资源暴露了从哪里获得下属,而不是他们是什么(更多的 RESTful?),不需要让下属提前,下属列表生成器(/channel 和/member)提供接口(类似方法) ,使响应更像服务。
反对: 现在需要三个调用来完全填充对象
选项4-(重新)考虑 REST 的对象设计
我正在重用[现有的]应用程序对象层次结构,并试图将其应用于 REST ——或者更直接地,为其提供一个 API 接口。
也许 REST 对象层次结构应该有所不同,或者新的 RESTful 思想暴露了现有对象设计的局限性。
欢迎对上述问题有任何想法。