74

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

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

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

4

8 回答 8

75

REST 是一种不强加协议的架构风格。所以是的,如果您愿意,您可以使用 Web Sockets 进行 REST、使用 HTTP 进行 REST 以及使用 FTP 进行 REST。

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

我的咆哮: 如果您是 RESTliban 并且 Roy Fielding 的论文是事实的来源,那么动词永远不会被承认为语义的一部分。URI 是语义。对不同动作使用不同动词是 REST over HTTP 的优雅演变,但不是“真理”的一部分。您可以查看Roy 在他的论文第六章中评估的基于 HTTP 的 rest场景。没有提到动词。请注意,这是一个评估场景,而不是规范。

TLDR;

如果您需要通过 Internet 进行实时双向通信并且客户端是 Web 浏览器,那么最好的选择是 Web Sockets。然后,您可以在 Web 套接字之上实现应用程序级协议以实现 RESTful Web 服务。

于 2014-11-20T12:59:44.323 回答
19

是的。您可以将 REST over WebSocket 与 SwaggerSocket 等库一起使用。

于 2013-03-26T11:50:40.090 回答
8

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

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

于 2012-11-14T07:20:04.167 回答
3

REST 架构风格主要假定 2 个实体,即。客户端和服务器。

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

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

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

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

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

于 2016-08-20T16:00:58.590 回答
1

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

有一些 JavaScript 库可以将 XMPP 从浏览器传递到服务器。您所需要的只是将来自 WS 的 XMPP 流量代理到 TCP,然后直接进入您的 XMPP 服务器。Kaazing 有一个允许您执行此操作的网关。

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

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

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

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

于 2012-11-16T02:01:31.437 回答
1

我知道这篇文章真的很老了,但想进一步插话“所以如果我选择 REST 架构,我就失去了实时通信的能力?”的概念。

一句话,没有。我在利用 REST 实现兼容性、可发现性以及作为在 IoT 阴影下跨不同设备进行扩展的一种手段方面有过许多 REST 样式实现的经验。

但是,除了使用 WS 之外,除了 REST 来方便近乎实时的传输。还有一些抽象可以真正帮助解决这个问题,让您可以专注于构建您的 API 并决定消费应用程序的 RT 组件应该如何操作。

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

于 2017-12-19T04:42:06.407 回答
1

我创建了一个向 Web 套接字发送函数添加回调的项目:https ://github.com/ModernEdgeSoftware/WebSocketR2

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

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

于 2018-01-28T14:20:28.543 回答
0

我刚刚在一家为游戏提供云解决方案和“服务器端/服务即平台”(SaaS)的公司的博客上发现了新话题。

我不是为这家公司做广告,也不是我使用它们,所以我什至不知道它们的好坏。

但是,他们非常清楚地解释了原因以及在 REST 中使用 WebSockets 的好处在他们的博客上阅读

于 2016-02-05T20:30:47.200 回答