微信号:infoqchina

介绍:有内容的技术社区媒体

REST的缺点是什么?

2013-06-06 17:31 InfoQ

最近,有人在LinkedIn REST架构师讨论组中的一片帖子中问道,“REST的缺点是什么?”

对REST有深入研究的架构师Ganesh Prasad对此做了回复,然后又在其个人博客中重申了自己的观点:


我不能说REST有“缺点”。它说到的都做到了,而且做得很好。但是,请记住REST架构的实现唯一使用的协议是HTTP。我们可以肯定地想象REST在另一种传输协议上的实现,而且其中还包含诸多方面的增强。


Ganesh和许多人一样,将REST等同于REST/HTTP,即基于HTTP的REST。他提到REST有四个可以改进的方面:


1. HTTP是一个同步的请求响应式协议。这意味着它不能天然地支持服务端发起的通知(点对点),但这又是经常需要的。这就解释了为什么REST风格的应用程序中的回调需要使用应用层的设计模式,如Webhooks。现在,我们有了WebSockets这样的双向传输协议,也许工业界应该考虑在其之上根据REST原则设计一款新的应用协议。


2. REST社区从Web Service协议栈中至少能够学到一些东西:"这些协议都是基于核心的SOAP和WS-Addressing消息机制能力之上的端到端的协议"。Web Service之于WS-Addressing、WS-ReliableMessaging、WS-SecureConversation和WS-Policy好比Internet之于TCP、IP和IPSec等。REST的应用幂等性可以更好地实现可靠性,而且可以找到REST事务的替代方案。


3. HTTP的动词太少,尤其对于需要做点对点交互的场景。他建议:"INCLUDE(将资源加入到某个资源集合中并返回服务端设定的URI)、PLACE(使用客户端指定的URI向资源集合中添加资源)、REPLACE(全部替换)、FORCE(PLACE或REPLACE)、AMEND(部分更新,它是一个容器动词,为一个资源子集指定一个或多个动词)、MERGE(通过提供的表述合并部分资源)、RETIRE(比DELETE更好)和SOLICIT(替换GET,它也是一个容器动词,用于告知响应端对发起方的资源做些什么,因为现在是点对点的场景了)"。


4. "HTTP合并了应用层和传输层的状态码(如,304 Not Modified和400 Bad Request;407 Proxy Authentication Required和502 Bad Gateway)。 REST在另一个协议上的实现应该更清晰地隔离应用层协议和传输层协议。HTTP承担了双份工作,因此其结果也往往不尽完美。"


参照一下HTTP 2.0的初始草案,就能发现它不可能完全采纳Ganesh的建议。这些问题该如何解决?


点击“阅读原文”查看更多内容并吐槽吧。

 
InfoQ 更多文章 Facebook如何实现PB级别数据库自动化备份 学术派Google软件工程师Matt Welsh谈移动开发趋势 Spotify为什么要使用一些“无聊”的技术? 妹纸们放假了,汉纸们做啥? 大多数重构可以避免
猜您喜欢 课多周刊第3期 【盘点】电影中八大邪恶的超级计算机 我是如何从煤矿工成为程序员的 从技术经理的角度算一算,如何可以多快好省的做个app 高效R开发(二):Microsoft R