在开发中使用到 Webhook,收集资料记录一下。
Webhook 是一种“回调”机制,允许系统 A 在某些事件发生时,主动向系统 B 发送 HTTP 请求,实时通知事件发生或传递相关数据。与传统的轮询方式不同,Webhooks 是一种高效的事件驱动式通讯方式。
Webhook 的架构
- 事件源:
- 触发 Webhook 的服务,例如支付网关或代码仓库。
- 事件目标:
- 接收并处理 Webhook 的服务,例如商户服务器或 CI/CD 工具。
- 数据流:
- HTTP POST 请求,用于传递 JSON 或其他格式的数据。
- 安全机制:
- 通过验证 Token 或数字签名确保数据来源可信。
工作原理
-
事件监听: 系统 A(如应用、服务)预先配置一个 Webhook,当某些事件(如数据更新、用户操作)发生时,它会自动触发。
-
数据推送: 系统 A 将事件相关的数据以 HTTP 请求(通常是 POST 请求)的形式发送到系统 B 提供的 Webhook URL。
-
处理逻辑: 系统 B(即接收端)接收数据后,执行相应的处理逻辑(如记录数据、触发任务)。
常见应用场景
-
支付通知: 如微信支付或支付宝,会在用户完成支付后通过 Webhook 通知商家的服务器,更新订单状态。
-
版本控制: GitHub 提供 Webhook,当代码库有提交或 PR 时,通知 CI/CD 系统触发自动构建和部署。
-
实时消息通知: 聊天工具(如 Slack、Discord)可以通过 Webhook 接收第三方系统的消息提醒。
-
自动化任务: 使用 Webhook 在事件发生时触发自动化工作流,例如通过 Zapier 集成多个工具。
示例
假设你有一个在线商店,每次客户下订单时,你希望库存管理系统自动更新库存。
-
发送端(商店系统): 当客户下单后,商店系统调用库存管理系统的 Webhook URL,发送订单信息。
-
接收端(库存系统): 接收订单数据后,自动减少库存。
POST /webhook-endpoint HTTP/1.1
Host: inventory.example.com
Content-Type: application/json{"order_id": "12345","product_id": "abc123","quantity": 2
}
const express = require('express');
const bodyParser = require('body-parser');const app = express();
app.use(bodyParser.json());// 接收 Webhook 的 POST 请求
app.post('/webhook', (req, res) => {console.log('Received webhook:', req.body);// 根据请求内容执行逻辑res.status(200).send('Webhook received');
});// 监听端口
const PORT = 3000;
app.listen(PORT, () => {console.log(`Webhook server is running on port ${PORT}`);
});
接收端
import requestswebhook_url = "http://localhost:3000/webhook"data = {"event": "order_placed","order_id": 12345,"status": "confirmed"
}# 发送 POST 请求
response = requests.post(webhook_url, json=data)
print(f"Response: {response.status_code}, {response.text}")
Chatbot 使用代码
优势
- 实时性:数据推送是即时的。
- 高效性:避免频繁轮询,节省资源。
- 灵活性:可以在多个系统间无缝集成。