快速了解 Webhook 是什么?有什么用?

什么是 Webhook

"Webhook" 的名字源于它的功能,顾名思义 Web 代表网页,Hook 代表钩子 。当一件事发生时,服务端会将相关信息发送给你设定好的 URL,这个 URL 就像一个钩子,抓取到了数据后,再将它传递给客户端进行处理。这种机制可以用于信息主动推送的场景,例如收到新告警通知、新邮件或订单时即刻得到通知并做出相应处理。

Webhook 本质上是一种事件驱动的 HTTP 回调机制。参与这个机制的有两方:

  • 消费方:开发一个可以接收请求的 Web 服务,并为这个服务暴露一个接口,当接口收到请求时,解析事件信息,并触发相关业务流程。
  • 服务方:定义一些事件或条件,当这些事件/条件触发时,向消费方暴露的接口 URL 发送请求,并且在请求中携带一些跟这个事件相关的信息。

Webhook 通常会使用在如下场景中:

  • 持续集成与代码部署(CI/CD) 代码仓库在有新提交或构建完成后,通过 Webhook 触发测试、构建和部署流水线。
  • 支付和电商系统回调 一个订单支付完成后,通过 Webhook 通知电商、物流、邮寄等系统执行后续操作。
  • 业务监控与报警 对关键业务指标进行监控,异常时通过 Webhook 将事件通知推送到 IM 系统(企业微信,飞书,钉钉等等),实现快速响应。

以业务监控与报警使用的场景为例,整个使用的过程如下:

  1. 小 o 在 Slack 上创建一个叫 "预警助手" 的机器人, 并获得了一个Webhook URL: https://hooks.slack.com/services/T0001/B00001/XXXXX
  2. 小 o 在监控告警系统记录下了这个 Webhook URL,当宕机时触发 Webhook
  3. 当服务器宕机时,监控系统发送一个 POST 请求到上面的 URL,请求体中包含了 "服务器192.168.1.1 已离线" 的文本信息
  4. Slack 接收到 Webhook 请求后,自动以 "预警助手" 的名字,把请求体中的文本信息发送到了运维人员的 Slack 频道上
  5. 运维小李立即收到 Slack 信息,查看服务器并处理故障

Webhook 和 API 有什么区别

假设你在一个电商网站上购买了商品, 你可以通过主动查询订单 API 来获取订单状态和物流信息。这是 API 的使用方式,通信流是单向的,信息是被动获取的。

若电商网站可以通过 Webhook 让物流公司主动推送订单状态。一旦订单发货,物流系统就主动发送一个 HTTP 请求到电商系统提供的 Webhook 回调地址,将发货和物流信息推送过去。这种主动推送就是 Webhook。

再举个简单的例子。API 是你主动问老师: "请问我的考试成绩出来了吗?" 然后老师告诉你结果。Webhook 则是老师主动在考试出分后通知你: "同学,你考了90分,成绩已经出来了。" 当然前提是你得关心你的成绩。

所以 Webhook 和 API 最大的区别是信息的流通方向,Webhook 场景中提供 URL 的是消费方,API 则是服务方,Webhook 是一种反向的 API。

Webhook 与 API 轮询,Websocket 有何不同

大家可能还知道轮询和 Websocket 这两种常用的主动获取(推送)数据的方式,那么它们和 Webhook 有何不同呢?

相比于 WebSocket:

  • WebSocket 是持续的双向通信通道,需要维持连接。Webhook 是不连续的 HTTP 回调。
  • WebSocket 更适合频繁的实时交互。Webhook 更适合重要事件的即时通知。
  • WebSocket 有更高的使用复杂性。Webhook 基于简单的 HTTP 协议,更容易实现。

与轮询的区别:

  • 轮询是客户端主动周期性请求数据。Webhook 是服务器主动推送数据。
  • 轮询会产生大量无效请求和流量。Webhook 消息更精确和即时。
  • 轮询有频率和时效问题。Webhook 主动推送,超低延迟。

Webhook 只会在事件发生时发送最小通知,更轻量级和即时。基于 HTTP ,也更容易跨平台集成,兼容性好。对服务器压力较小,所以 Webhook 特别适合进行事件通知。

Webhook 的安全机制

由于 Webhook 的 URL 是需要由消费方提供给服务方的,这,在这个过程可能导致 Webhook url 的泄露,比如你不小心把某个群聊飞书机器人的 Webhook url 粘贴到公开平台了,而这个 Webhook又没有配置任何安全措施导致被其他人滥用,那你的群里可就热闹了,机器人会变成你们群聊中最啰嗦的一员。

所以,除了要保管好 Webhook URL,尽量避免外泄,配置一些 Webhook 的安全机制也是很有必要的,常见的安全机制有如下三种:

  1. IP 白名单:服务器只接收在 Approved IP 列表 中的请求。就像一个酒店只会让认证的客人自由出入。
  2. 携带认证信息:在请求头或参数里加用户名/密码等身份信息。就像网吧要登记身份证才给你开机上网。
  3. 数据加密 :对请求的数据加密,让别人无法读取。像手机支付的 Ast Transfer 是加密的,密码在传输过程中不会被泄露。Body 数据加密又通常使用这两种方式:
    • 参数化和 HMAC:向请求中添加随机参数或时间戳参数,然后使用 HMAC 算法基于密钥计算请求数据的哈希作为签名,发送给客户端。客户端可以验证签名的正确性。
    • JSON Web Tokens:使用 JWT 标准中的数据加密方法对请求 Payload 部分加密,保证数据安全性。

如何实现 Webhook

消费方要做的事情:

  1. 定义回调接收接口(URL): 提前准备用于接收 Webhook 数据推送的接口地址,并对外公开。
  2. 接口验证: 在接口中验证请求来源的合法性,如签名、时间戳等,确保请求的安全性。
  3. 解析推送数据: 对请求体中的数据进行格式化和解析,以获取业务事件的相关信息。
  4. 触发业务流程: 根据解析后的事件内容,触发相应的业务逻辑,完成后续动作。
  5. 返回响应: 给服务方一个确认的响应,表示成功接收到数据。

服务方要做的事情:

  1. 注册事件和回调接口: 记录下消费方配置的响应回调接口 URL 和触发回调所需的业务事件。
  2. 检测事件触发条件: 通过代码、任务或触发器等方式,检测所注册的业务事件是否发生。
  3. 构建请求数据: 根据定义好的数据格式,构建要推送的请求体。
  4. 发送请求: 向注册的消费方接口地址发送 Webhook 请求,将事件数据推送给消费方。
  5. 处理响应和重试: 处理消费方的响应结果,如果请求失败,则进行重试推送。

整体流程与实现一个普通 API 类似,只是 Webhook 是从服务端到另一个服务端的请求,而且 url 是需要主动暴露的。

Webhook 标准化

目前关于 Webhook 已经有社区在推动规范化和标准化:www.standardwebhooks.com/ ,社区中定义了一套可预期和可扩展的 Webhook 规范,主要提到了 Webhooks 广泛用于向 API 用户发送事件,但生态系统过于碎片化,而碎片化阻碍了提供商和消费者的技术发展。因此在整个行业标准化 Webhooks 被提出,作为解决安全性和兼容性等问题的解决方案。

目前主流协作办公/IM 平台暴露的 Webhook 所需的响应体各不相同。飞书,企业微信,钉钉,slack,teams 几乎是一人一套规范,它们从数据格式,加密机制到事件类型都存在差异,给开发者集成增加了额外工作量。这也是为什么行业内呼吁标准化 webhook 的原因之一。

提议的标准化包括基于现有行业最佳实践的严格指南,以及有关 Payload 结构的正式规范。 关于安全性、可靠性、互操作性的标准化设计目标,以及满足现有 Webhook 实现的向后/向前兼容性。Payload 结构是每个 Webhook 的核心部分,应以 JSON 格式在 HTTP 体中传递。标准中为不同事件类型和元数据提供了Payload 结构示例。

最关键是提供了一套社区驱动的工具和指南,用于开源和社区采用标准化,主流语言都可以通过 SDK 快速实现标准化的 Webhook。

总结

这篇了 Webhook 的工作原理、安全性考量、最佳实践以及各种使用场景。Webhook 通过其 "推" 的方式实现了实时数据更新的能力。随着越来越多公司采用 Webhook,相关的安全标准和最佳实践也在不断完善。遵循这些标准有助于应用更加安全、可靠的集成外部程序。

如果文章对你有帮助请为我点个赞,respect!

相关推荐
Bs_MoneyMagnet1 小时前
基于springboot+vue的滑雪场票务与装备租赁系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring·毕业设计·计算机毕业设计
AlienZHOU5 小时前
AI Coding 时代下,我的技术面试实践分享
前端·后端·面试
狗头大军之江苏分军8 小时前
《潮水漫过十七岁》开学了
后端
苏三说技术8 小时前
如何看待GPT-6在UP主众测中碾压夺冠?它是现在最强大模型吗?
后端
mldong8 小时前
一份 JSON,一条能跑的审批流:把报销流程送上工作流引擎
后端·架构
wno7048 小时前
Spring Boot WebFlux增删改查
java·spring boot·后端
Captaincc9 小时前
AI用量v0.1.11更新发布 新增 jusage doctor 诊断指令 托盘展示token 和余额 新增 AutoClaw 支持
前端·后端·vibecoding
aramae10 小时前
模拟实现strlen()函数 (C语言)
c语言·开发语言·后端
计算机魔术师10 小时前
德国Wiki被黑后两周,OpenAI终于把模型失控的账本摊开了
前端
kyriewen10 小时前
我让 AI 当面试官面了我一轮:第 3 个追问我就卡住了(附 10 道追问清单)
前端·面试·ai编程