Socket.io和RESTFul如何协同工作?
(我对RESTFul不熟悉,如果我的概念错误,请纠正我)
在RESTFul体系结构中,我们将每个操作映射到一个URL。 如果我点击“发表文章”,可能实际上是URL http://example.com/
和一些数据action=post&content=blahblah
。
如果我想发布,但不刷新整个网页,我可以使用JavaScript的XMLHTTPRequest。 我发布它,然后得到它的内容,并将其插入到我的网页中的div。 这些操作都是asynchronous的。
然后我知道有一个名为WebSocket
东西,它是封装的socket.io
。 它使用“消息”在客户端和服务器之间进行通信。 当我点击“发布”客户端只是调用socket.send(data)
并等待服务器的client.send(data)
。 这是神奇的。 但是URL呢?
两种模式都可以使用而不用重复自己? 换句话说,每个动作都有它的URL,其中一些可以实时与用户交互(通过socket.io?)
而且,我应该这样做吗? 在一个非常互动的networking程序(例如游戏)中,RESTFul仍然是有意义的?
您正在为通过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
我最近在我的博客上发布了这个 :
为WebSocketsdevise一个CRUD API
在构buildWeld时 ,我们使用REST和WebSockets(Socket.io)。 WebSocket上的三个观察:
- 由于WebSockets是如此自由的forms,你可以命名你想要的事件,但最终不可能debugging。
- WebSocket没有HTTP的请求/响应forms,所以有时很难判断事件来自哪里,或者去哪里。
- 如果WebSockets可以适应应用程序中现有的MVC结构,那么最好使用与REST API相同的控制器。
我的解决scheme
- 我的服务器上有两个路由文件: routes-rest.js和routes- sockets.js
- 我的事件看起来像这个例子:
"AppServer/user/create"
。 - 我使用正斜杠 (“/”)使事件看起来像路由path。
- 第一个string是目标 (〜“主机名”,如果这实际上是一个path)。
- 第二个string是模型 。
- 第三个string是CRUD动词 :即创build,读取,更新,删除。