Webhook 是一个能让外部服务与 n8n 进行实时通信的神奇工具。简单来说,当某个事件发生时,外部服务会立即将数据推送到你的 n8n 工作流,触发自动化流程。
相比传统的"轮询"方式(不断询问是否有新数据),Webhook 更高效、更实时。一旦事件发生,数据就被立即发送给 n8n,n8n 立刻开始处理。
n8n 为每个 Webhook 节点自动生成两个不同的 URL:
| 类型 | 用途 | 特点 |
|---|---|---|
| 测试URL(Test URL) | 开发和测试时使用 | 临时有效(120秒),数据在编辑器中可见,便于调试 |
| 正式URL(Production URL) | 部署到生产环境 | 工作流激活后永久有效,数据不在编辑器显示,需查看执行日志 |
重要提示:
Webhook 支持所有标准 HTTP 方法:
大多数应用场景下,选择 POST 就够了。
Webhook 节点有三种响应方式:
| 响应模式 | 说明 |
|---|---|
| 立即响应(Immediately) | 立即返回 "Workflow got started" 消息,工作流继续后台处理 |
| 最后节点完成时响应(When Last Node Finishes) | 等待整个工作流完成,返回最后一个节点的输出 |
| 使用 Respond to Webhook 节点 | 完全控制响应内容、状态码和请求头 |
在 Webhook 节点的设置面板中:
HTTP 方法:POST(根据你的需求选择)
路径:例如 /webhook/process-form
认证方式:None(开发时),生产环境建议用 Basic Auth、Header Auth 或 JWT获取你的 Webhook URL:
curl -X POST 'https://your-n8n.url/webhook/process-form' \
-H 'Content-Type: application/json' \
-d '{"name":"张三","email":"zhangsan@example.com"}'在 Webhook 节点后面添加其他节点来处理接收到的数据:
当 Webhook 接收请求时,n8n 会将数据解析成 JSON 对象,包含以下部分:
| 数据来源 | 表达式 | 例子 |
|---|---|---|
| 查询参数(?key=value) | {{ $json.query.key }} | {{ $json.query.user_id }} |
| 请求头(Headers) | {{ $json.headers['header-name'] }} | {{ $json.headers['content-type'] }} |
| URL路径参数(/:id) | {{ $json.params.id }} | {{ $json.params.user_id }} |
| 请求体(Body) | {{ $json.body }} 或 {{ $json.body.field }} | {{ $json.body.customer_name }} |
JavaScript 不支持对象属性名中的连字符。访问含有连字符的请求头时,需要用方括号表示法:
❌ 错误:{{ $json.headers.user-agent }}
✅ 正确:{{ $json.headers['user-agent'] }}当请求的 Content-Type 为 application/json 时,n8n 会自动解析为 JSON 对象:
{
"body": {
"customer": {
"name": "Jane Doe",
"email": "jane@example.com"
},
"order": {
"items": [
{"name": "T恤", "qty": 2},
{"name": "杯子", "qty": 1}
]
}
}
}访问嵌套数据:
{{ $json.body.customer.name }} // 获取客户名字
{{ $json.body.order.items[0].name }} // 获取第一个商品名称从 HTML 表单提交来的数据会自动解析到 body 中:
{
"body": {
"customer_email": "user@example.com",
"customer_name": "李四",
"product_id": "prod_12345"
}
}使用 Set 节点提取数据:
{{ $json.body.customer_email }}| 认证类型 | 用途 | 安全性 |
|---|---|---|
| None | 内部工具、本地开发 | ⚠️ 无保护 |
| Basic Auth | 信任的服务商 | ✅ 基础保护 |
| Header Auth | 自定义 API 密钥 | ✅✅ 中等保护 |
| JWT Auth | 移动应用、公开 API | ✅✅✅ 高级保护 |
这个工作流接收表单数据,验证后保存到数据库,最后向用户发送确认邮件。
工作流流程:
工作流 JSON 代码(复制到 n8n 导入):
{
"nodes": [
{
"parameters": {
"path": "form-submit",
"httpMethod": "POST"
},
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"typeVersion": 1,
"position": [250, 300]
},
{
"parameters": {
"values": {
"string": [
{
"name": "email",
"value": "={{ $json.body.email }}"
},
{
"name": "name",
"value": "={{ $json.body.name }}"
},
{
"name": "message",
"value": "={{ $json.body.message }}"
},
{
"name": "submitted_at",
"value": "={{ new Date().toISOString() }}"
}
]
},
"keepOnlySet": true
},
"name": "Set",
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [450, 300]
},
{
"parameters": {
"jsCode": "const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\nif (!emailRegex.test(items[0].json.email)) {\n throw new Error('Invalid email format');\n}\nreturn items;"
},
"name": "Validate Email",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [650, 300]
},
{
"parameters": {
"documentId": {
"__rl": true,
"value": "your-google-sheet-id",
"resource": "doc"
},
"sheetName": "responses",
"columns": {
"mappingMode": "defineBelow",
"value": [
{
"header": "email",
"key": "email"
},
{
"header": "name",
"key": "name"
},
{
"header": "message",
"key": "message"
},
{
"header": "submitted_at",
"key": "submitted_at"
}
]
}
},
"name": "Save to Google Sheets",
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.4,
"position": [850, 300]
},
{
"parameters": {
"respondWith": "allIncomingItems"
},
"name": "Respond to Webhook",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.2,
"position": [1050, 300]
}
],
"connections": {
"Webhook": {
"main": [[{"node": "Set", "type": "main", "index": 0}]]
},
"Set": {
"main": [[{"node": "Validate Email", "type": "main", "index": 0}]]
},
"Validate Email": {
"main": [[{"node": "Save to Google Sheets", "type": "main", "index": 0}]]
},
"Save to Google Sheets": {
"main": [[{"node": "Respond to Webhook", "type": "main", "index": 0}]]
}
}
}如何使用这个工作流:
action 属性中填入这个 URL测试请求(使用 curl):
curl -X POST 'https://your-n8n-instance/webhook/form-submit' \
-H 'Content-Type: application/json' \
-d '{
"name": "王五",
"email": "wangwu@example.com",
"message": "这是一条测试消息"
}'预期响应:
{
"success": true,
"message": "Form submitted successfully",
"timestamp": "2024-12-02T15:30:00Z"
}原因:使用了测试 URL 而不是正式 URL
解决:
解决步骤:
原因:n8n 可能运行在反向代理后面
解决:
设置环境变量:
N8N_PROXY_HOPS=1如果有多个反向代理,将 1 改为相应数字。
解决:
data)答:默认限制为 16MB
如果是自托管 n8n,可以通过环境变量调整:
N8N_PAYLOAD_SIZE_MAX=300mb错误信息:"The path and method you chose are already in use"
原因:n8n 不允许注册相同路径和方法的多个 webhook
解决:
当工作流可能超过 100 秒时(n8n Cloud 的超时限制),可以采用异步轮询模式:
jobId$json.body、$json.query 等)来访问数据[1] 官方文档: https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.webhook/
[2] n8n 系列教程: https://www.undsky.com/blog/?category=n8n%E6%95%99%E7%A8%8B#