ReST over websockets可能吗?

时间:2012-11-14 05:54:46

标签: rest websocket xmpp

我计划开发一个基于Web的聊天应用程序,它接收ReSTful请求,将它们转换为XMPP并将它们传送到XMPP服务器。

对于这种基于聊天的应用程序使用websockets看起来很有希望,因为事件(或响应)可以异步传递。但是,如果我使用websockets作为从浏览器传输请求的底层协议,这仍然可以被视为ReSTful设计吗?如果是,那么在websocket消息中如何表示URI,动词(GET,POST ...)参数?将它们包装在xml / json中并发送它?

此外,ReSTful架构声明服务器上不会存储任何会话状态。但是在这种情况下,当创建XMPP客户端会话时,此会话的状态将存储在服务器上(违反无状态约束)

8 个答案:

答案 0 :(得分:59)

REST是一种不强加协议的架构风格。所以,是的,如果你愿意的话,你可以使用Web套接字,使用HTTP的REST和使用FTP的REST进行REST。

使用HTTP的主要原因是通过HTTP与任何组件或编程语言进行通信既简单又相当简单,并且因为HTTP支持具有多个中介的分布式环境:代理,防火墙......;因此,您可以在任何拓扑上部署您的服务,任何人都可以访问它。

我的咆哮: 如果你是一个RESTliban并且Roy Fielding的论文是真理的来源,那么动词永远不会被认为是语义的一部分。 URI是语义。对不同动作使用不同的动词是REST over HTTP的优雅演变,但不是“真相”的一部分。您可以查看他的论文rest over HTTP evaluated by Roy in chapter six的情景。没有提到动词。请注意,这是一个评估方案,而不是规范。

TLDR;

如果您需要通过互联网进行实时双向通信,而客户端是Web浏览器,则最佳选择是Web套接字。然后,您可以在Web套接字上实现应用程序级协议,以实现RESTful Web服务。

答案 1 :(得分:16)

是。您可以将REST over WebSocket与 SwaggerSocket.

等库一起使用

答案 2 :(得分:10)

为什么要在socket上构建REST API?恕我直言,REST API的好处是利用标准的HTTP协议可能性,如无状态请求,语义动词(如GET,DELETE)来构建一个(客户端)开发人员可以轻松理解的API。由于套接字不提供HTTP动词等,你可以为套接字构建某种HTTP层,这是恕我直言,这是不合理的。

如果您真的要构建这样的东西,我建议使用HTTP协议作为蓝图,并实现像HTTP这样的套接字协议。

答案 3 :(得分:2)

我不明白为什么要将XMPP转换为REST然后在WS上运行REST。 WebSocket的目的是将XMPP协议直接带到浏览器,从而避免所有的翻译问题。

有一些JavaScript库可以将XMPP从浏览器与服务器通信。您所需要的只是将来自WS的XMPP流量代理到TCP中,然后直接进入您的XMPP服务器。允许你这样做的Kaazing has a gateway

如果要使用开源,则需要编写JavaScript XMPP库。有一些示例显示如何为简单协议编写JS库。您只需找到一个并将概念扩展到XMPP协议。

回顾一下,以下是架构的外观:

您的XMPP客户端代码< - > XMPP JavaScript库< - > WebSocket over http< - > WebSocket到TCP代理< - > XMPP服务器

其中XMPP客户端代码和XMPP JavaScript库在浏览器中运行,而WS到TCP代理以及XMPP服务器都是服务器端。

答案 4 :(得分:2)

REST架构风格大多假设2个实体即。客户端和服务器。

随着我们更多地转向实时Web和反应系统的开发,WebSocket将突出地开始取代REST API的使用。

WS允许数据推送和拉取,这解决了服务器和客户端的概念。

STOMP,AMQP,XMPP可以用作消息传递协议。

数据本身可能是JSON或Google协议缓冲区,也可能是Apache Avro。

WebSockets不依赖于Web服务器,但也可以在移动应用程序或桌面应用程序等独立应用程序中开发。

答案 5 :(得分:1)

我只是在一家公司的博客上发现了一个新主题,该公司提供了云解决方案和服务器端/服务作为平台" (SaaS)游戏。

我没有宣传这家公司,也没有使用它们,所以我甚至不知道它们有多好或多坏。

但是,他们非常清楚地解释了在REST中使用WebSockets的原因和好处 阅读their blog

答案 6 :(得分:1)

我理解这篇文章真的很老了,但是想进一步介绍"那么如果我选择一个REST架构,我会失去实时通信的能力?"。

总之,没有。我已经体验过许多REST风格的实现,利用REST来实现兼容性,可发现性,以及在物联网的阴影下跨不同设备进行扩展的方法。

但是,除了使用REST之外,还可以使用REST来促进近实时传输。还有一些抽象确实对此有所帮助,使您可以专注于构建API并决定消费应用程序的RT组件应如何运行。

如果您正在寻找构建REST API并希望避免为您的RT需求重新创建轮子,我建议您查看Tibco Smart-Sockets或SignalR等内容。

答案 7 :(得分:1)

我创建了一个项目,它将回调添加到Web套接字发送功能:https://github.com/ModernEdgeSoftware/WebSocketR2

建立消息ID,以便客户端可以实现回调。它会在超时后处理消息重试,并在连接断开时重新连接到服务器。 然后,您可以通过添加谓词和路径将有效负载构建为RESTful。

这类似于视频游戏工作室使用UDP来实现他们所需的速度,但他们的网络代码实现了许多类似于TCP的可靠性功能。