选择WebSockets还是REST?

过去的几年,WebSockets逐渐成熟并变得可用。去年年底,WebSockets距离成为标准更近了一步:成为了W3C CR。Oracle和其他一些组织最近也提交了关于在下个版本的Java EE中启动WebSockets标准化的请求。所有的主流浏览器如Chrome,FireFox,Safari和IE都支持众多WebSockets版本中的一种,但如果标准一旦制定,无论如何他们也将最终遵循制定的标准。在一个相对较短的时间里,WebSockets几乎已经成了Web不可分割的一部分。然而,仍然有部分开发者不确定WebSockes是否或者适应Web的架构风格:REST。他们中的一些,例如Nathan Evans就比较激进,他认为WebSockets可能给REST蒙上阴影。

在详细阅读了标准以及吸收了一些网上围绕此话题展开的讨论之后,我日益认为这份标准将占有RESTful服务的大量思想。我的意思是说,未来某个时间在产品开发时将会有人问到: 

"好吧兄弟们,这个产品中我们到底是用WebSockets呢还是REST?" 

我期望在一两年内 WebSockets将开始阻止RESTful Web服务的发展,至少如我们现在所知的那样。

在他的文章中,Nathan认为尽管他承认WebSockets并非完美,但基于他使用REST的经验,REST也不是他人所描述的银弹。然后他列出了WebSockets为何会成为REST的威胁的几条理由,包括“不够格”的REST框架依赖基于文本协议的情况。还有一些相比REST,WebSockets提供的重要好处,比如双向交互的能力。

WebSockets提供的真正的双工通信是任何其他HTTP传输的协议所不具备的,无论它是SOAP还是REST。而Comet,Push和长轮询也只能模拟,还非常低效。双工通信天性就足够好滴允许你建立实时TCP通讯协议,比如RDP或VNC。

Nathan相信WebSockets提供的好处比REST(HTTP)更有用,所以开发者们将会喜欢WebSockets而转向使用它。

REST可能仍将是需要可视性和跨平台互操作性的项目的首选。然而不需要这些特性的项目将很可能选取WebSockets,在其上仍可使用JSON,或 一种预定的通讯协议。尽管他们是竞争者的关系,他们仍可共存.事实上,他们其实是相辅相成的,因为他们都是建立在HTTP基础之上。  

然而,Nathan并非提出"WebSockets or/versus REST"这一问题的唯一一人。例如Shay Bannon在2010年曾提出是否可以在WebSockets中使用REST的原则的一些问题。

首要的是,如何表示一个URL?其次,你如何表示一个HTTP方法?最后,你如何表示HTTP URL参数和HTTP头?看起来一种解决办法是在让内容文本遵循一种规则,就像JSON字符串那样,具有一个URL字段和参数字段等等。但这也是很恼人的,因为在HTTP中,你可以直接使用HTTP头或者参数来很简单地创建连接,而不需要解析内容。

他觉得为何WebSockets就没有“URI”或“头”的概念,因此是否需要一种REST-over-WebSockets的规范,以防止人们重新发明REST并最终导致“各行其道”?那时他的文章收到了各种答复,比如一个答复者说他在一个WebSockets公司工作,所以他的观点可能不是客观的,他提到:

REST和WebSocket的通讯看起来是分布式计算管道的两种类型。REST是那个老学校,坐在HTTP的顶上,同步风格的web调用。WebSocket是新的,坐在HTTP旁边的,通常是异步的web通信。恕我直言,长期看来,WebSocket将显著地降低WAN计算中对于REST的需求。使用WebSocket,过去几十年中我们所熟知和喜爱的所有协议将被扩展,并且不会出现在使用HTTP的情况下的笨拙和低效。

还有另外一个提到:

我认为REST陷入了传统的请求/响应模式。而WebSocket满足了Comet和长轮询的场景,通讯管道在多次通讯过程中并不关闭。同时,到WS初始的握手仍然由HTTP发起,所以实际上他们并非互斥的。我还认为WS协议的目的就在于摆脱HTTP头中那些令人讨厌的东西,因为它们冗长并且只增加了负载。

然而,在同意REST和WebSockets能并且应该共存的同时,一些评论者完全不同意REST-over-WebSockets规范的概念。一个说道:

如果你把REST看作字段式的,具有地址的资源,那么这在双向通讯中无法工作。你无法期待资源会初始化对话,WebSocket会改变Web,但不是作为一个REST风格的通信协议。

而另一个更详细地描述了自己的观点:

WebSockets就像两个人的对话,是完全双工的,因此双方都可以同时说话,而且双方在说话的时候也都必须同时保持监听。REST是无状态和同步的,只能处理请求->响应。要获得自发的服务器向客户端的通信,你必须扩展REST的概念。我看到过一个使用WebSocket实现了REST的库,但它也只能对于那些已经有了RESTful API并且想要获得低开支的好处,以使单个连接即可满足通信要求而不用重构代码的应用有好处。

REST社区也有一些人,比如 Jim Webber,认为WebSockets 对web来说不是好的选择

Jim Webber tweet

在WebSockets即将成为标准之际,它正在被广泛支持并使用于浏览器、手机,想要弄清楚它们对正在使用REST和HTTP的开发者会产生多大的影响是很有趣的,亦或它们针对的是不同的开发者团体?更糟的是,一些人相信我们正在冒着“破坏Web网络”的危险?

英文原文:WebSockets versus REST?

 

原文发布时间为:2013-06-03

时间: 2025-01-29 22:55:55

选择WebSockets还是REST?的相关文章

《JavaScript高效图形编程(修订版)》——6.11 一个图形使用画布的WebSockets聊天应用

6.11 一个图形使用画布的WebSockets聊天应用 在下面的例子中我们将看到一个更实用的画布应用程序:一个伪3D聊天应用程序(如图6-15所示).这个例子将演示如何将画布和其他HTML5特性如WebSockets结合. 6.11.1 WebSockets优势 除画布外,另一个同样令人振奋(但可能比较不知名)的HTML5元素是WebSockets.虽然这本书是关于图形的,但还是值得讨论一下为什么WebSockets对现代Web应用程序意义重大,以及如何将它们与画布集成. 通常服务器和客户端浏

MQTT, XMPP, WebSockets还是AMQP?泛谈实时通信协议选型 good

Wolfram Hempel 是 deepstreamIO 的联合创始人.deepstreamIO 是一家位于德国的技术创业公司,为移动客户端.及物联网设备提供高性能.安全和可扩展的实时通信服务.文本由魏佳翻译,转载译文请注明来自高可用架构.   想要向服务器发送请求并获得响应?直接使用 HTTP 吧!非常简单.但是当需要通过持久的双向连接来通信时,如 WebSockets,当然你也有其它的选择. 这篇文章会简单扼要的解释 MQTT,XMPP,STOMP,AMQP,WAMP 和其它替代品.这里常

Qt之WebSockets

简述 WebSocket 是一个基于 Web 的协议,旨在使 client 应用程序和远程主机之间进行双向通信.如果最初的握手成功,则两个实体可以来回发送数据.WebSocket 是通过用更少的网络延迟和最小数据交换来努力获取实时数据的应用程序解决方案. 简述 优点 工作原理 使用方式 典型用例 Qt WebSockets 的角色 Qt WebSockets 与 Cloud Services 相关信息 优点 Qt WebSockets 使你能够构建 WebSocket 应用程序.它提供了一个 W

PhotoShop“相加”和“减去”模式精确选择颜色

一.关于"相加"模式 "相加"模式的公式:[(源1+源2)/缩放]+补偿值=结果 从公式看,结果可以通过缩放值和补偿值进行调整,如果缩放为1,补偿值为0,那么结果=源1+源2.下面,就以此为前提进行讨论. 结论1:R.G.B三个通道中任何两个"相加",结果为第三个通道之外的颜色.即: 1.红+绿=蓝色之外的颜色; 2.红+蓝=绿色之外的颜色; 3.绿+蓝=红色之外的颜色. 很有意思,也很好记吧.给一个自己做的图,通过"计算"试

mfc-为什么我的CRecordset的open方法要手动选择数据源?是哪里出了问题?

问题描述 为什么我的CRecordset的open方法要手动选择数据源?是哪里出了问题? CDatabase db; if( db.Open(_T("mysql5.1"),false,false,_T("ODBC;UID=root;pwd=19930318"),true)) { IrisRecordSet *pIrisRecordSet = new IrisRecordSet(); CString sql="select * from iris"

自主选择Win7“睡眠”和“休眠”模式

我看着电脑上一堆正待处理的照片,犹豫着要不要关电脑.如果关机,回来的时候很多程序.网页又要重新打开;如果不关机,电脑白白开着浪费电.真有点左右为难-- 大哥笑着说:"Win7有睡眠和休眠功能,选用一个呗!" "睡眠和休眠有啥区别呢?"我问道. 大哥告诉我:电脑在"睡眠"状态时会切断除内存外其他配件的电源,工作状态的数据将保存在内存中,需要唤醒时,只需要按一下电源按钮或者晃动一下 USB鼠标就可以快速唤醒电脑恢复睡眠前的电脑状态.但因为睡眠状态并没

ubuntu-关于bios双系统启动选择

问题描述 关于bios双系统启动选择 请问在bios里如何设置可以开机时弹出boot option 让你停住选择?默认启动ubuntu的话会进入grub命令行那里.试了好多种排列方式都是默认加载windows,而且在启动选项里有两个ubuntu的选项. 解决方案 下一个软件,easybcd,可以设置默认启动项,等待时间.具体请百度 解决方案二: BIOS不是只能设置开机方式(硬盘开,光盘开还是y盘开)么?我也想问怎么设置第一选项,我的系统开机默认为Ubuntu的boot引导 解决方案三: 是mb

JAVA程序员面试32问 选择自 liujun999999 的 Blog (本人做收藏)

程序|程序员 第一,谈谈final, finally, finalize的区别. 第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统). 第四,&和&&的区别. 第五,HashMap和Hashtable的区别. 第六,Collection 和 Collec

空间|时间|对象 圈人 + 目标人群透视 - 暨PostgreSQL 10与Greenplum的对比和选择

标签 PostgreSQL , PostGIS , geohash , brin , gist索引 , Greenplum , HybridDB for PostgreSQL 背景 通常一个人的常驻地可能会包括:家.儿女家.双方父母家.情人.异性伴侣家.公司.商圈若干等. 通过对这些数据的运营,可以实现很多业务需求.例如: 1.寻人 <海量用户实时定位和圈人 - 团圆社会公益系统(位置寻人\圈人)> 2.线下广告投放人群圈选,选址,商圈人群画像. <数据寻龙点穴(空间聚集分析) - 阿里