Socket.io和RESTFul如何协同工作?

时间:2011-06-14 05:18:31

标签: node.js socket.io restful-architecture

(我对RESTFul并不熟悉,如果我的概念错了,请纠正我)

在RESTFul架构中,我们将每个操作映射到一个URL。如果我点击“发布文章”,可能实际上是网址http://example.com/和一些数据action=post&content=blahblah

如果我想发布,但不刷新整个网页,我可以使用javascript的XMLHTTPRequest。我发布它然后得到它的内容并将其插入我的页面中的div。这些操作都是异步的。

然后我知道有一些名为WebSocket的东西,它是包装socket.io。它使用“消息”在客户端和服务器之间进行通信。当我点击“发布”时,客户端只需拨打socket.send(data)并等待服务器的client.send(data)。这很神奇。但URL怎么样?

可以在不重复自己的情况下使用这两种模式吗?换句话说,每个动作都有它的URL,其中一些可以实时与用户交互(通过socket.io?)

而且,我应该这样做吗?在一个非常互动的网络程序(例如游戏)中,RESTFul仍然有意义吗?

2 个答案:

答案 0 :(得分:37)

您正在为通过http映射到REST的操作定义处理程序。 POST和GET通常是指对实体的更新和查询。绝对没有理由您只能为这两种情境中可以使用的CRUD操作的泛型版本定义处理程序。我通常这样做的方法是引入一条“路线”的概念。到实时传输,并将它们映射回相同的CRUD处理程序。

你有一个会话,你可以施加相同的ACL等。

 +---------------------------------+
 |                                 |
 |      BROWSER                    |
 |                                 |
 +--+--^-------------------+---^---+
    |  |                   |   |
    |  |                   |   |
 +--v--+---+            +--v---+---+
 |         |            |          |
 | HTTP    |            | SOCKET.IO|
 +--+---^--+            +--+---^---+
    |   |                  |   |
 +--v---+------------------v---+---+
 |                                 |
 |        ROUTING/PUBSUB           |
 +-+--^-------+--^-------+--^------+
   |  |       |  |       |  |
 +-v--+--+  +-v--+--+  +-v--+-+
 |       |  |       |  |      |
 | USERS |  | ITEMS |  |ETC   |
 +-------+  +-------+  +------+
     ENTITY CRUD HANDLERS

答案 1 :(得分:29)

我最近posted this on my blog

为WebSockets设计CRUD API

构建Weld时,我们正在使用REST和WebSockets(Socket.io)。关于WebSockets的三点观察:

  1. 由于WebSockets是如此自由格式,您可以根据需要命名事件,但最终无法进行调试。
  2. WebSockets没有HTTP的请求/响应形式,因此有时很难分辨出事件的来源或去往。
  3. 如果WebSockets可以适应应用程序中的现有MVC结构,最好使用与REST API相同的控制器,那将是很好的。
  4. 我的解决方案:

    • 我的服务器上有两个路由文件: routes-rest.js routes-sockets.js
    • 我的活动如下例所示:"AppServer/user/create"
    • 我使用正斜杠(“/”)使事件看起来像路由路径。
    • 第一个字符串是目标(如果这实际上是路径,则为〜“主机名”)。
    • 第二个字符串是模型
    • 第三个字符串是 CRUD动词:即创建,读取,更新,删除。