如何在 API 和各种客户端之间创建全双工通信?

How to create a full-duplex communication between API and various clients?

在我的网站中,我想创建一个 public API 以允许客户(不认识的人)与我的服务进行交互。在这种情况下,经典的 REST API 会很好地工作。

但是,我也需要能够向客户端发送事件。这些事件与客户端 HTTP 请求无关。我看到 "webhooks" 是一种处理此问题的方法。如果我理解得很好,使用 webhook,我的服务将向客户端指定的 URL 发送 HTTP POST 请求,并在该请求中包含事件数据。

我认为 websocket 也可以用作这种全双工通信需求的解决方案。

我想知道的是,哪种方法最容易让客户实现与我的服务对话?简单是这里的关键点。 困难的是我的客户可以使用各种技术(带有 HTTP 服务器的完整网站,iOS/Android 没有服务器的应用程序,等等)

如果我使用 REST API + webhooks,对客户有什么影响?网络套接字? ETC? 如何选择?

希望它很清楚(但不确定)。谢谢:)

我认为 webhooks 是一种更简单的解决方案。是的,您理解得很好,使用 webhook,使用您的 API 的开发人员会注册一个 URL,您的后端会在其中 POST 事件数据。这是 API 中使用的常见模式。

使用 webhooks 设计的一大好处是 client/server 连接不需要保持打开状态。毕竟,如果事件不经常发生(即每小时或每天只有几次)或保持一致的连接打开是一个挑战,则仅在需要时建立连接是相当有效的。

API 提供者,使用 webhook 的挑战是设计一个事件后端系统,处理状态变化检测和可靠的 webhook 调用机制(即处理 webhook 接收器 URL s 无响应或抛出错误)。

在开发人员端使用 webhook 的挑战在于他们需要建立一个可靠的 Web 服务器来侦听来自您的服务器的事件 POST 数据。

Realtime APIs(即基于 Websockets,Bayeux/CometD) are really swell because that live connection means that new connections do not have to be established, which is particularly useful with very chatty sessions. Additionally, there are a lot of projects and companies out there that have taken care of the heavy lifting on the server and client with fully-baked libraries. One of those is Fanout.io 这使得在 client/server 之间推送消息成为可能,只需几行代码,尽可能使用 XMPP、Bayeux 和 Websockets。

(我不隶属于Fanout,但我用过)

所以,总而言之,webhook 很简单,主要是因为您已经熟悉实现它们所需的架构,而且该模式是一个广为流传的模式。如果您倾向于持久连接方法,我会像 Fanout 一样看待 tools/platforms,因为它负责繁重的工作(即 subscribe/publish、并发连接规模、client/server库)。