在将REST [api]结构与OO模型进行比较时,我看到了这些相似之处:
都:
面向数据
- REST =资源
- OO =对象
围绕数据的环绕操作
- REST =在资源周围环绕VERBS(获取,发布,...)
- OO =通过封装促进对象周围的操作
但是,例如,在尝试应用外观模式时,良好的OO实践并不总是站在REST api上:在REST中,您没有1个控制器来处理所有请求,并且您没有隐藏内部对象的复杂性。
相反,REST促进资源与资源之间的所有关系的发布以及至少以两种形式的其他关系:
通过资源层次关系(ID为43的联系人由地址453组成):
/api/contacts/43/addresses/453
通过REST json响应中的链接:
>> GET /api/contacts/43 << HTTP Response { id: 43, ... addresses: [{ id: 453, ... }], links: [{ favoriteAddress: { id: 453 } }] }
回到OO,外观设计模式考虑了objectA及其“ objectB客户 ” Low Coupling
之间的a,以及此objectA及其内部对象组成(objectC,objectD)。随着对象A接口,这允许开发者在极限冲击对象B的对象A的内部变化(objectC和objectD),只要对象A API(操作)仍尊重。High Cohesion
在REST中,数据(资源),关系(链接)和行为(动词)分解为不同的元素,并可供Web使用。
在使用REST的过程中,我始终会对客户端和服务器之间的代码更改产生影响:因为我High Coupling
在Backbone.js
请求Low Cohesion
之间和资源之间进行更改。
我从来没有想过如何让我Backbone.js javascript application
处理由REST链接促进的“ REST资源和功能 ” 发现。我知道WWW是由多台服务器提供服务的,并且必须分解OO元素才能由其中的许多主机提供服务,但是对于简单的情况,例如“保存”一个显示其地址的联系人的页面,我最终得到:
GET /api/contacts/43?embed=(addresses) [save button pressed] PUT /api/contacts/43 PUT /api/contacts/43/addresses/453
这导致我在浏览器应用程序上移动了保存操作原子事务处理责任(因为可以分别处理两个资源)。
考虑到这一点,如果我不能简化开发(不使用Facade设计模式),并且给客户端带来更多的复杂性(处理事务性原子保存),那么使用RESTful的好处在哪里?
PUT /api/contacts/43
级联更新内的对象?我有很多这样设计的API(主URL读取/创建/更新“整个”,子URL更新各个部分)。只需确保不需要更改就不会更新地址(出于性能原因)。