# Webhook

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

通过 HTTP 请求启动工作流，并选择响应的内容和时机。

Webhook 将收到的 HTTP 请求作为一次运行的入口。需要将工作流发布到能够对外提供 Webhook 地址的部署环境。

## 声明请求

选择 HTTP 方法，并声明请求体字段。公开编排接口通过 `config.body` 接收按名称组织的字段定义。

```json
{
  "op": "node.add", "as": "webhook", "type": "webhook", "name": "Receive a ticket",
  "config": {
    "method": "POST",
    "body": { "message": { "schema": { "type": "string" }, "nullable": false } }
  }
}
```

请求数据通过触发器声明的输出提供。读取请求体字段时，从 `body` 输出中按直接属性名选择。请求不会自动把值绑定到任意下游输入。

## 选择响应模式

*   **立即响应**：省略 `options.responseBody`，使用已配置的即时响应。
*   **工作流输出**：选择 `kind: "workflow-outputs"`，等待整次运行成功后返回全部工作流输出或其中一个字段。
*   **响应节点**：选择 `kind: "webhook-response"`，指定一个可达节点，在它第一次成功完成时返回响应。

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)

## 动态响应限制

动态响应超时范围为 1,000–60,000 毫秒，默认为 30,000 毫秒，排队和等待时间也计入其中。HTTP 超时不会取消已经接收的运行。

工作流输出模式中，字符串按文本返回，其他 JSON 值按 JSON 返回。选定输出缺失或运行未成功时会返回错误。状态码和响应头也可按文档规定的约束，从工作流输出中选择。

切换模式时，应明确清除相应字段。固定响应文本、状态码和响应头即使当前未生效，也可能仍保留配置。清除一个嵌套字段，不等于清除了其他响应策略。

CORS、响应头限制、请求限制和对外地址配置，均以部署端规则为准。提前确认请求的用法见 [Webhook 响应](https://openflow.run/zh-cn/docs/nodes/webhook-response/index.md)。

## 资料来源

*   [docs/authoring/node-authoring.md](https://github.com/oomol-lab/open-flow/blob/e25a738d170322734572a0b8a1323cb00b9d355a/docs/authoring/node-authoring.md#webhook-http-responses)
*   [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)
