什么是Webhook?
Webhook(谐音"网络钩子")是一种事件驱动的消息推送机制。
说人话就是:你告诉别人一个你的网址,一旦发生了某件事,对方就会往这个网址发一条消息。
举个生活中的例子:
轮询(没有Webhook):你每隔5分钟就打开冰箱门看一眼,牛奶洒了没有。浪费时间和力气。
Webhook:你什么都没做,但牛奶洒的那一刻,冰箱自动给你手机发了一条通知。
在技术世界里,这就是核心区别。
Webhook有什么用?
Webhook解决的核心问题是:如何高效地让不同服务之间实时沟通?
常见场景:
- 代码提交通知:你把代码推送到GitHub,GitHub自动通知你的构建服务器开始打包。
- 支付成功回调:用户付完钱,支付平台自动告诉你"钱到了",你不用再一直问支付平台"付了没"。
- 聊天机器人:有人在群里@机器人,飞书/钉钉通过Webhook把消息推送给你自己的服务。
- 自动化工作流:用户在你的网站填写了表单,表单服务自动通知你的数据库保存数据。
关键点:Webhook让你不用主动去查,别人发生了就通知你。
Webhook怎么用?
基本流程
整个Webhook机制其实就三步:
第一步:注册回调地址
你把自己的服务器地址告诉提供方,比如:
https://yoursite.com/api/webhook/github
告诉GitHub:“我的代码有变化时,往这个地址发消息。”
第二步:提供方发送请求
当触发事件时(有人push代码),GitHub会向你提供的地址发送一个HTTP POST请求。请求体通常包含事件详情,格式一般是JSON:
{
"event": "push",
"repository": "my-project",
"ref": "refs/heads/main",
"commits": [
{
"author": "zhangsan",
"message": "修复登录bug"
}
]
}
第三步:你的服务器接收并处理
你的服务器收到请求后,解析JSON内容,执行对应逻辑。比如自动触发构建、发送通知邮件等。
自己写一个Webhook(Python示例)
用Flask写一个接收Webhook的服务器,不到20行:
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/webhook/github', methods=['POST'])
def github_webhook():
data = request.get_json()
# 判断是什么事件
event = request.headers.get('X-GitHub-Event')
if event == 'push':
print(f"收到推送!仓库: {data['repository']['name']}")
# 在这里写你的处理逻辑
# 比如触发构建、发通知等
return jsonify({"status": "ok"}), 200
app.run(port=5000)
就这么简单。你的服务变成了一个"Webhook接收器"。
安全性注意
Webhook有个潜在问题:怎么确认请求是真的来自GitHub,不是别人伪造的?
大多数服务会提供签名验证机制。比如GitHub会带上一个X-Hub-Signature-256头,你用自己的密钥来验证这个签名,确保请求来源合法。
总结
Webhook的本质就一句话:被动等待,事件触发,自动响应。
它比轮询高效得多——不用一直问"发生了吗",而是等对方说"发生了"。
几乎所有主流平台都支持Webhook:GitHub、GitLab、Stripe、飞书、钉钉、企业微信、Slack……学会Webhook,你就掌握了一种跨服务协作的基础技能。
要不要试试给你的服务接一个Webhook?从一个简单的"收到通知就打印日志"开始就好。