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

Lai*_*uan 35 node.js socket.io restful-architecture

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

在RESTFul体系结构中,我们将每个操作映射到URL.如果我点击"发表文章",可能它实际上是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仍然有意义吗?

Jos*_*osh 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
Run Code Online (Sandbox Code Playgroud)


Tom*_*und 32

我最近在我的博客上发布了这个:

为WebSockets设计CRUD API

构建Weld时,我们使用REST和WebSockets(Socket.io).WebSockets上的三个观察结果:

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

我的解决方案

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