# Webhook 响应

Source: https://openflow.run/zh-cn/docs/nodes/webhook-response/
Language: zh-CN
Product version: 0.1.0-beta.77

在指定节点完成时返回 HTTP 响应，工作流可以继续执行。

如果需要在整次运行结束前向调用方确认已收到请求，可以使用 Webhook 响应节点。Webhook 配置中需要选择要使用的响应节点。

## 配置响应

节点有以下固定输入：

| 输入 | 值 |
| --- | --- |
| `body` | 任意 JSON 值，默认为空文本。 |
| `statusCode` | HTTP 状态码数字，默认为 200。 |
| `headers` | 值为标量的响应头对象，默认为空对象。 |

```json
{
  "op": "node.add", "as": "response", "type": "webhook-response", "name": "Acknowledge",
  "inputs": {
    "body": { "kind": "value", "value": "Accepted" },
    "statusCode": { "kind": "value", "value": 202 }
  }
}
```

在同一批修改中，将 Webhook 的 `config.options.responseBody` 设为 `{ "kind": "webhook-response", "nodeId": "$response", "timeoutMs": 30000 }`，并连接从 Webhook 到该响应节点的执行路径。

## 响应时机

第一次成功执行时，节点会提交不可变的响应快照。HTTP 调用方无需等待后续节点即可收到响应。此后的失败、循环迭代或重试，都不会替换这份响应。

POST Webhook 将声明的 message 传给代码节点；Webhook 响应节点返回确认消息，后续任务仍可继续。

**输入**
POST 请求体：{"message":"Please check my order"}

**预期结果**
HTTP 202，文本为 "Received: Please check my order"，并包含 X-Workflow: ticket-intake。

**运行前准备**
将工作流发布到对外提供 Webhook 地址的部署环境。

[下载工作流](https://openflow.run/docs/examples/webhook-response.openflow.json)

该节点没有业务输出，但可以连接下游执行节点。工作流可以有多个响应节点，每个 Webhook 只选择其中一个可达节点。如果运行成功，但选中的响应节点被跳过，HTTP 会返回错误。

## 使用限制

响应头可以逐项填写固定值，也可以将整个对象绑定到一个输入来源，不支持为每一项分别绑定动态来源。部署端的响应头和来源策略仍然生效。嵌套工作流中的响应节点不能回答父运行的 HTTP 请求。

此节点没有节点重试或错误处理策略。响应模式和超时设置见 [Webhook](https://openflow.run/zh-cn/docs/nodes/webhook/index.md)。

## 资料来源

*   [docs/authoring/node-authoring.md](https://github.com/oomol-lab/open-flow/blob/e25a738d170322734572a0b8a1323cb00b9d355a/docs/authoring/node-authoring.md#early-webhook-response-nodes)
*   [docs/control/contracts/control-api.md](https://github.com/oomol-lab/open-flow/blob/e25a738d170322734572a0b8a1323cb00b9d355a/docs/control/contracts/control-api.md#trigger-configuration-and-outputs)
*   [packages/open-flow/src/workbench/browser/runtime/editor/addNodeOptions.ts](https://github.com/oomol-lab/open-flow/blob/e25a738d170322734572a0b8a1323cb00b9d355a/packages/open-flow/src/workbench/browser/runtime/editor/addNodeOptions.ts)
