42

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

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

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

然后我知道有一些东西叫做WebSocketwrapper socket.io。它使用“消息”在客户端和服务器之间进行通信。当我单击“发布”时,客户端只需调用socket.send(data)并等待服务器的client.send(data). 这很神奇。但是 URL 呢?

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

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

4

2 回答 2

41

您正在为通过 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
于 2011-06-15T22:31:20.727 回答
40

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

为 WebSocket 设计 CRUD API

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

  1. 由于 WebSocket 的格式如此自由,您可以随意命名事件,但最终无法调试。
  2. WebSockets 没有 HTTP 的请求/响应形式,因此有时很难判断事件来自哪里或要去哪里。
  3. 如果 WebSocket 可以适合应用程序中现有的 MVC 结构,那就太好了,最好使用与 REST API 相同的控制器。

我的解决方案:

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