Webhooks 允许通过使用自定义回调在基于 Web 的应用程序之间进行交互。 Webhooks 的使用允许 Web 应用程序自动与其他 Web 应用程序通信。与一个系统(主体)为某些数据不断轮询另一个系统(观察者)的传统系统不同,Webhooks 允许观察者在发生某些事件时自动将数据推送到主体的系统中。
这消除了对受试者进行不断检查的需要。 Webhooks 完全在 Internet 上运行,因此,系统之间的所有通信都必须采用 HTTP 消息的形式。
网络钩子的使用
Webhook 依赖于静态 URL 的存在,这些 URL 指向主题系统中的 API,当观察者系统上发生事件时必须通知这些 API。这方面的一个例子是一个网络应用程序,旨在收集和管理用户亚马逊账户上的所有订单。在这种情况下,Amazon 充当观察者,Custom-Order-Managing Webapp 充当主体。
与让自定义 web 应用程序定期调用亚马逊的 API 来检查创建的订单不同,自定义 web 应用程序中创建的 Webhook 将允许亚马逊通过注册的 URL 自动将新创建的订单推送到 web 应用程序中。因此,要启用 Webhook 的使用,主题必须具有接受来自观察者的事件通知的指定 URL。由于仅在发生事件时才在两方之间进行 HTTP 调用,因此这会显着减少该主题的负载。

基于轮询的系统与基于 Webhook 的系统
一旦主体的 webhook 被观察者调用,主体就可以对这个新推送的数据采取适当的行动。通常,Webhooks 通过特定 URL 上的 POST 请求执行。 POST 请求允许向主题推送附加信息。此外,它还可以用于识别一组各种可能的事件,而不是为每个事件创建单独的 Webhooks URL。
网络钩子工作流程
要在您的应用程序上实现传入的 webhook,需要包括以下基本步骤:
- 在您的应用程序服务器上公开一个 API 端点,它接受和处理 HTTP POST 调用
- 为 webhook 的潜在用户提供对这个端点的访问。只要满足相关条件,API 端点就会被称为数据源应用程序。
- 处理 POST 数据并向 webhook 调用发起方返回响应以指示状态。此步骤可能存在也可能不存在。
Webhooks 与 API
Webhooks 和 API 的目标都是在应用程序之间建立通信。但是,使用 Webhooks 而非 API 来实现应用程序集成有一些明显的优点和缺点。
如果以下几点与正在实施的系统更相关,则 Webhook 往往是更好的解决方案:
- 如果服务器上的数据经常更新,Webhooks 往往是更好的解决方案,因为客户端对服务器的不必要的 API 调用被消除了。根据resthooks.com,98.5% 的API 民意调查被浪费了。
- Webhooks 为需要近实时数据更新的系统提供了更好的解决方案。 API 的轮询通常以预先指定的时间间隔运行,这可能会阻止实时数据更新。使用 Webhook,只要触发 Webhook,服务器就会将更新推送到客户端。
在某些其他情况下,API 的使用应该优先于 Webhooks。通过 Webhooks 使用 API 需要考虑的重要方面是:
- API 的使用允许更多定制何时从服务器轮询数据以及从服务器轮询多少数据。要轮询的数据量通过 API 轮询大小进行调整。使用 webhooks,服务器通常决定数据以及推送数据的时间。
- 对于具有高度可变数据的系统(例如实时系统、IoT 系统等),基于 API 的轮询可能是更好的选择,因为对于每个 API 调用,很有可能做出可操作的响应。
- 在 REST 端点离线的情况下,由服务器通过 Webhook 推送的数据可能会被客户端完全忽略。在服务器没有重试此类失败推送的机制的情况下,数据更新将完全丢失。
为了解决 Webhook 离线时服务器推送的数据丢失的可能性,您可以使用事件消息队列来存储此类调用。提供此类功能的平台示例包括RabbitMQ或Amazon 的简单队列服务 (SQS)。两者都旨在充当中间消息存储设施,以避免丢失 webhook 调用的可能性。
Slack 中的 Webhook
许多流行的平台都提供了创建可用于自定义应用程序的 Webhook 的功能。消息平台 Slack 也提供了这样一个系统,允许在被调用时将消息推送到用户的 Slack 帐户中。
要创建 Slack webhook URL,我们需要通过 Slack 控制台设置传入 Webhook 集成,如下所示:
- 从您需要为其创建 Webhook 的帐户登录 slack.com
- 导航到 https://my.slack.com/services/new/incoming-webhook。
- 选择将推送消息的默认通道。
- 您还可以指定帐户名称和个人资料图片等详细信息,以识别这些推送消息的来源。
- 复制生成的 Webhook URL

在 Slack 中添加传入的 Webhook
要将消息推送到 Slack 通道,必须在 Webhook URL 上执行 POST 请求,并在请求正文中指定要发送的消息。成功执行请求后,应将消息推送到用户的 Slack 帐户中。

使用 Webhook 将消息推送到 Slack
Discord 中的 Webhook
如今,许多流行的平台都提供了使用集成创建 Webhooks 的功能,这些集成可能会在 Github、Circle CI 等自定义应用程序中使用。社区平台 Discord 也提供了这样一个系统,允许将消息推送到用户的 Discord 服务器。
要创建 Discord webhook URL,我们需要通过 Discohook 设置传入 Webhook 集成,如下所示:
- 从您需要为其创建 Webhook 的帐户登录到 https://discord.com/。
- 创建服务器或使用现有服务器。
- 导航到服务器设置,然后选择集成 -> 创建具有相应属性的 webhook。
- 选择要推送消息的默认频道。
- 复制生成的 Webhook URL。

添加网络钩子
我们将使用 DiscoHook 推送一些已发布的通知或 url。

Discohook – 只需提供我们希望通知的所有详细信息。
我们所做的是为我们的用户创建自定义消息,以获取他们需要的所有必需信息。比如说,让我们来看这样一个案例:学生们正在为他们的实习准备面试,我们可以在以下方面帮助他们:
Discord 机器人将通知:

Discord 通知 -> 单击链接和进度。