选择Websocket REST范例

时间:2016-03-25 17:00:44

标签: rest websocket socket.io signalr webhooks

由于REST是一种架构风格,而不是协议,因此它可以应用于大多数协议形式 - 例如websockets。这正是我想要做的,但我希望帮助决定一种方法。

在我做研究时,我发现我可以遵循三种范式:

  • 模拟请求 - 响应。这是SwaggerSocket library中实现的内容。每个客户端请求都有一个ID。每个服务器推送响应都具有相同的ID,以允许请求 - 响应的关联。
  • 通知 - 仅即可。服务器推送资源地址,暗示客户端应该对该资源执行GET以发现已更改的内容。
  • 事件驱动。 server-push的设计看起来像HTTP POST,可能类似于webhook请求。

我希望听到那些有经验走过这些路径的人,他们发现哪些路径最有效,以及他们应用了哪些工具(例如上面提到的SwaggerSocket)。

我所关注的一个主要问题是简化了解复用和反序列化。例如,假设我有一个用Typescript编写的客户端。我可能希望将服务器推送有效负载反序列化为声明的类型对象。我认为每种范式的后果如下:

  • 模拟请求 - 响应(SRR)。必须将SwaggerSocket消息反序列化两次。首先发现响应ID和/或"路径",然后再将实际有效负载检索到"键入"宾语。有点笨拙,但可行。
  • 通知 - 仅即可。可以将服务器推送消息反序列化为单个预定义类型,因为它只包含一个REST资源路径。
  • 事件驱动。如果"事件"没有有效负载,那么这与Notification-Only方法基本相同。但是如果有有效载荷,则可能需要再进行两步反序列化。

我的其他想法:SRR可能是三者中最受限制的,因为理论上每个服务器推送都是由客户端请求发起的。另外两种范式没有隐含的模型。事件驱动方法具有与webhook回调类似的概念优势。

为了说明Event Driven / webhook的想法,我将给出一个SignalR示例。

//client side.
hubProxy.On<HttpRequest>("EventNotice", request => {
    //Take apart the HttpResponse and dispatch through
    //my own routing mechanism...to handlers that 
    //further deserialize the inner payload.
});

//The corresponding server-push would of course be:
_context.Clients.All.EventNotice(myHttpRequest);

上面的例子非常容易实现。事实上,我不会感到惊讶,有人为此目的提供示例代码(请分享!)甚至是支持库。

同样,在这些不同的范例中,你会建议吗?你会建议哪些支持工具?

0 个答案:

没有答案