Webhook 接收数据容易,但“读懂”才是自动化的核心
笔者在 N8N大学 社区里,看到太多同学卡在第一步:Webhook 节点明明接收到了数据,却不知道怎么把里面的值拿出来用。这种感觉就像收到了一个层层包裹的快递,看着挺大,却不知道怎么拆。
其实,n8n 的 Webhook 节点设计得非常聪明,它把外部传进来的 JSON 数据自动转换成了 n8n 的标准数据格式(Item)。今天这篇硬核教程,笔者就带你拆解开这个“快递”,教你如何精准提取每一个字段。
第一步:理解 Webhook 的“数据映射”机制
很多新手的第一反应是:我传了一个 JSON,为什么在 n8n 里看不到树状结构?
n8n 的 Webhook 节点有一个核心机制,它会把接收到的 JSON 数据自动映射到 body 对象中。这意味着,无论你传的是简单的键值对,还是复杂的嵌套 JSON,它们都躺在 body 这个大盒子里。
所以,提取字段的第一步,就是学会在表达式里引用 body。
第二步:使用“表达式”提取单层字段
假设你的 Webhook 接收到了如下最简单的 JSON 数据:
{
"name": "N8N大学",
"status": "active"
}
在 n8n 中,如果你想提取 "name" 这个字段,你需要使用 表达式 (Expression)。
- 在后续节点(如 HTTP Request 或 Set 节点)的输入框中,点击输入框旁的
fx按钮。 - 输入:
{{ $json.body.name }}
解析: 这里的 $json 代表当前数据项,body 是 Webhook 自动映射的根路径,name 则是你具体的字段名。
第三步:提取嵌套 JSON 对象(深度解析)
实战中,我们面对的往往是复杂的嵌套结构。例如,一个支付回调可能长这样:
{
"event": "payment.success",
"data": {
"order_id": 12345,
"user": {
"id": 67890,
"email": "student@n8ndx.com"
}
}
}
这时候,提取深层字段的语法就是“层层剥洋葱”:
- 提取订单 ID:
{{ $json.body.data.order_id }} - 提取用户邮箱:
{{ $json.body.data.user.email }}
笔者经验: 如果你不确定路径是否正确,可以在 Webhook 节点后连接一个 Set 节点,或者直接使用 Debug 节点,查看数据结构的可视化展示,确认路径后再写表达式。
第四步:处理数组(List)数据
如果 Webhook 传来的 JSON 是一个数组,比如商品列表,n8n 会自动将其拆分为多个 Item 进行处理。
数据结构如下:
[
{ "product": "鼠标", "price": 50 },
{ "product": "键盘", "price": 100 }
]
当你在后续节点使用 {{ $json.body.product }} 时,n8n 会自动遍历:
- 第一个 Item 处理 "鼠标"。
- 第二个 Item 处理 "键盘"。
你不需要写循环代码,n8n 的核心逻辑就是基于 Item 的流式处理。
第五步:避坑指南——Header 与 Query 参数的提取
除了 JSON Body,Webhook 还经常带有 Header(如 API Token)或 Query Params(如 ?source=web)。
在 n8n 的 Webhook 节点配置中,你需要开启对应的设置:
- Header 参数: 在 Webhook 节点的设置里,将 "Response" 栏下的 "Options" 展开,确保 "Raw Body" 没有勾选(除非你必须处理原始流),然后在表达式中使用
{{ $headers.header_name }}。 - Query 参数: 同样在 Webhook 配置中,开启 "Query Parameters",在表达式中使用
{{ $query.parameter_name }}。
硬核提示: 如果你在 Webhook 节点的输出里看不到 headers 或 query,记得去 Webhook 节点的 "Parameters" -> "Options" 里,把 "Include Headers" 或 "Include Query" 勾选上,否则 n8n 默认可能不暴露这些数据。
FAQ:Webhook 数据提取常见问题
1. 为什么我使用了表达式,却提示 "undefined"?
通常是因为路径写错了。请仔细检查 JSON 结构层级,确保大小写一致。最简单的排查方法是:在 Webhook 后加一个 Set 节点,用 {{ JSON.stringify($json.body, null, 2) }} 输出整个结构,对照着写。
2. Webhook 接收的数据是 XML 格式怎么办?
n8n 的 Webhook 节点原生接收的是字符串。如果对方发来的是 XML,你不能直接用 $json.body.field。你需要先连接一个 Code 节点(使用 Node.js)或 XML 节点将 XML 转换为 JSON,然后再进行提取。
3. 我想修改 Webhook 返回给调用方的数据,怎么操作?
在 Webhook 节点下方连接一个 Respond 节点。在 Respond 节点中,你可以设置 HTTP 状态码(如 200),并在 "Body" 里填入你想返回的 JSON 数据,例如 { "msg": "接收成功", "id": {{ $json.body.id }} }。
总结与资源
在 n8n 中,Webhook 是连接外部世界的桥梁,而表达式则是开启这座桥梁的钥匙。掌握 $json.body、$headers 和 $query 这三个核心变量,你就能处理 90% 的数据接收场景。
如果你在配置过程中遇到报错,或者有更刁钻的数据结构需要处理,欢迎在 N8N大学 (n8ndx.com) 留言,笔者会持续更新实战案例。记住,自动化不仅是技术,更是解决问题的艺术。