【问题标题】:Is ReST over websockets possible?是否可以通过 websockets 进行 ReST?
【发布时间】:2012-11-02 15:34:11
【问题描述】:

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

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

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

【问题讨论】:

    标签: rest websocket xmpp


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

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

        TLDR;

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

        【讨论】:

          【解决方案4】:

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

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

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

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

          【讨论】:

            【解决方案5】:

            我不明白您为什么要将 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 服务器都是服务器端的。

            【讨论】:

            • 客户端没有XMPP。这个想法是为了消除 Web 开发人员理解/了解 XMPP 的需要。他只需要了解 IM and Presence。示例:为了创建会话,Web 开发人员在他的小部件/应用程序中发送一个 POST 到某个 URI,以及他的用户名和密码,并且您术语中的“WS 到 TCP 代理”会将其转换为 XMPP 消息并将其发送到XMPP 服务器。
            • 再举一个例子:为了更新状态,一个 PUT 被发送到一个 URI,比如 /proxy/presence,代理将它转换为一个 XMPP 状态数据包并将它发送到 XMPP 服务器。类似的消息:一个 POST 被发送到 URI /proxy/message 并且代理将其转换为 XMPP 消息,将其发送到 XMPP 服务器,然后将其传递给接收者。使用 REST 的原因是 Web 开发人员可以很容易地使用 API 创建聊天应用程序。
            • XMPP 并不难理解,取决于 javascript XMPP 客户端库的用户友好性,该 API 实际上比使用 REST 更容易使用且更健壮。人们往往害怕他们不理解的东西,因此试图坚持他们所知道的东西,在这种情况下是 REST,即使它使它变得更加复杂和低效。我建议您花几分钟时间看看实际使用 XMPP 是多么容易。确实没有理由通过将 XMPP 转换为 REST 来引入一堆低效率和额外开销。这需要更多的工作,并且会限制您的创造力。
            【解决方案6】:

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

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

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

            【讨论】:

            • 请确保此处表示博客的意思,因为网站可以下线。
            • 嗯...这里的信息太多了,我不想复制/粘贴并参与抄袭。有官方来源的链接,就够了。如果该博客将关闭,我们总是有web.archive.org ;)
            【解决方案7】:

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

            【讨论】:

            • 没有。 Swagger 只是基于 websockets 的 HTTP,而不是真正的 REST。
            • @gentimouton 他说的只是你可以使用 Swagger 与 REST 服务交互。他从未说过 swagger 是 REST……你使用 HTTP 与 REST 交互,这就是重点。
            【解决方案8】:

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

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

            【讨论】:

            • 那么,如何实现与 REST 的实时通信呢?在 WebSockets 上使用 REST 的想法或多或少是合法的。我想拥有带有实时通信的 REST 语义。然而,我开始认为这两件事是完全不相容的。
            • @miguelcobain 我知道这真的很晚了,但是 REST 的整个概念是基于无状态请求的。 REST 中没有实时通信。
            • @Davy8 那么,你的意思是当有人选择使用 REST 时,他永远无法实现实时更新?我们是否坚持使用旧的基于间隔的服务器轮询技术?
            • REST over websockets 实际上很有意义。您可以实现一个 REST 层来保留标准 API 的所有优点,同时还可以获得 websocket 的优点(更少的数据开销和数据推送)。我很惊讶你得到了和你一样多的赞成票。
            • @saintedlama 这个答案是错误的,正如另一个答案所说,它是一种架构风格不应该依赖于协议
            猜你喜欢
            • 2014-11-30
            • 1970-01-01
            • 2013-04-09
            • 1970-01-01
            • 1970-01-01
            • 2022-11-07
            • 2012-02-03
            • 2011-06-07
            • 1970-01-01
            相关资源
            最近更新 更多