正文格式和数组拆分
并非每个系统都会发送 JSON,也并非每个请求都只涉及一件事。两个设置即可涵盖这两种情况。
正文格式
格式是从请求的Content-Type头中获取的。无论格式如何,您的字段映射都使用相同的点路径。
| 内容类型 | 解析为 | 典型的发件人 |
|---|---|---|
application/json |
JSON | 大多数 API、n8n、Make、Zapier |
application/x-www-form-urlencoded |
表单字段 | Twilio、PayPal IPN、纯 HTML 表单 |
multipart/form-data |
表单字段、文件部分将作为文件名 | 表单生成器、上传接口 |
text/xml, application/xml, *+xml |
XML | 旧版的ERP和承运商系统 |
有两个细节值得了解:
- 只要正文是有效的 JSON,就会始终被识别为 JSON,即使发送方将其标记为其他类型也是如此。许多工具在发送 JSON 时会将其内容类型设为表单,这样就能确保它们正常工作。
- 表单和 XML 正文可能包含您尚未映射的字段。这没关系:发送方自行决定其格式,因此这些正文不会经过像您所控制的 JSON 那样的严格检查。
A form-encoded webhook (for example Twilio)bash
curl -X POST https://your-app-url/webhook/ab12cd34 \
-H "Content-Type: application/x-www-form-urlencoded" \
-H "X-Api-Key: your-token" \
--data-urlencode "From=+15551234567" \
--data-urlencode "Body=Where is my order?"
# Map fieldOne to: From
# Map fieldTwo to: BodyXML 属性
XML 属性可通过其名称前缀为 @_ 的形式访问,因此 <order id="7"> 会被映射为 order.@_id,而 <order><name>Bob</name></order> 则为 order.name。值以文本形式传递,从而确保长 ID 的精确性。
将数组划分为片段
当一个请求包含一个列表时 - - 例如来自ERP系统的20笔订单,或一批库存更新 - - 通常希望工作流程针对每个项目分别运行一次,而不是对整个批次只运行一次。
在**“高级设置”->“将数组拆分为运行**”下,为数组指定路径:
| 路径 | 适用情况: |
|---|---|
items |
该数组是一个顶级字段:{ "items": [ ... ] } |
data.orders |
它是嵌套的:{ "data": { "orders": [ ... ] } } |
$ |
代码主体本身就是数组:[ { ... }, { ... } ] |
| (空) | 关闭。每个请求执行一次,这是默认设置。 |
每个元素都会成为一个独立的运行,该元素本身作为负载,因此映射路径是相对于该项的:应使用 map sku,而不是 items.0.sku``。
One request, three Flow runsjson
{
"items": [
{ "sku": "ABC-1", "qty": 2 },
{ "sku": "ABC-2", "qty": 1 },
{ "sku": "ABC-3", "qty": 7 }
]
}
// Split path: items
// Map fieldOne to: sku
// Map fieldTwo to: qty
// Response: { "runs": 3, "blocked": 0 }规则与限制
- 每次请求最多包含 100 项。超过此限的批次将被拒绝,以防止恶意发送者向您的工作流程发送大量请求。
- 如果任何项目缺少映射字段,或者其大小超出 Shopify Flow 的限制,则整个请求将被拒绝且不会发送任何内容,错误信息中会包含该失败项目的位置。这样可以确保批次处理采用“全有或全无”的原则,而非部分成功、部分失败。
- 作为普通值(而非对象)的项将以
{ "value": ... }的形式出现。 - 拆分不能与同步响应结合使用:一个调用者不能由多个运行实例来响应。参见 同步响应。
- 从“历史记录”中重播过去的运行会重新发送该单个项目,而非整个批次。
在“历史”栏目中
每个项目都是一个独立的条目,因此您可以分别查看、重试和回放每个项目。

