HTTP 请求节点
HTTP 请求节点用于在工作流中调用外部 API 和 Web 服务。它支持所有常见的 HTTP 方法、身份验证方式、自定义请求头和请求体,是连接第三方系统和服务的核心节点。
使用场景
典型应用
- 第三方 API 集成 - 调用 CRM、支付、物流等第三方服务
- 数据查询 - 从外部数据库或服务获取数据
- 数据提交 - 将处理结果发送到外部系统
- Webhook 回调 - 向其他系统发送事件通知
- 微服务调用 - 在微服务架构中调用内部服务
- 文件上传下载 - 上传文件到云存储或下载资源
- RESTful API 操作 - 执行 CRUD 操作
节点配置
基础设置(参数面板)
请求 URL (url)
要请求的 API 地址。
字段属性:
- 必填字段
- 支持表达式
- 支持 HTTP 和 HTTPS 协议
配置示例:
// 1. 静态 URL
"https://api.example.com/users"
// 2. 使用表达式构建 URL
`https://api.example.com/users/${$('实体识别').userId}`
// 3. 从配置中读取
$('配置节点').apiBaseUrl + "/orders"
// 4. 带查询参数(推荐使用查询参数配置)
`https://api.example.com/search?q=${$('聊天触发器').query}`请求方法 (method)
HTTP 请求方法。
可选值:
GET- 获取资源(默认:读取数据)POST- 创建资源(发送数据到服务器)PUT- 更新资源(完整更新)PATCH- 部分更新资源DELETE- 删除资源HEAD- 获取资源头信息(不返回 body)
默认值: POST
使用建议:
GET: 查询数据、获取列表
POST: 创建新记录、提交表单
PUT: 完整替换资源
PATCH: 部分更新字段
DELETE: 删除记录
HEAD: 检查资源是否存在身份验证 (authentication)
API 身份验证方式。
可选值:
none- 无需身份验证(默认)basic_auth- Basic 认证(用户名密码)jwt_auth- JWT Token 认证header_auth- 自定义请求头认证(如 API Key)
默认值: none
认证凭证 (credentials)
身份验证所需的凭证信息。
字段属性:
- 可选字段(当 authentication 不为 none 时需要)
- 支持表达式
- 根据认证类型格式不同
配置示例:
// Basic Auth - 格式:username:password
"admin:password123"
// JWT Auth - JWT token
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
// Header Auth - 直接提供 token 值
$('配置节点').apiKey
// 从环境变量读取
$('环境变量').API_SECRET_KEY发送请求头 (sendHeaders)
是否在请求中包含自定义请求头。
默认值: false
请求头格式 (specifyHeaders)
指定请求头的配置格式。
可选值:
keyValuePair- 键值对形式(默认,可视化编辑)json- JSON 字符串形式
默认值: keyValuePair
请求头 (headers)
自定义 HTTP 请求头。
字段属性:
- 根据 specifyHeaders 格式不同
- 支持表达式
键值对格式示例:
// 配置多个请求头
[
{ name: "Content-Type", value: "application/json" },
{ name: "X-API-Key", value: $('配置').apiKey },
{ name: "X-Request-ID", value: $('Webhook触发器').requestId }
]JSON 格式示例:
// 使用 JSON 字符串
`{
"Content-Type": "application/json",
"Authorization": "Bearer ${$('配置').token}",
"X-Custom-Header": "${$('数据').customValue}"
}`发送查询参数 (sendSearchParameters)
是否在 URL 中包含查询参数。
默认值: false
查询参数格式 (specifySearchParameters)
指定查询参数的配置格式。
可选值:
keyValuePair- 键值对形式(默认)json- JSON 字符串形式
默认值: keyValuePair
查询参数 (queryParams)
URL 查询参数(Query String)。
字段属性:
- 根据 specifySearchParameters 格式不同
- 支持表达式
- 会自动进行 URL 编码
键值对格式示例:
// 配置多个查询参数
[
{ name: "page", value: "1" },
{ name: "limit", value: "20" },
{ name: "category", value: $('AI分类器').class },
{ name: "keyword", value: $('聊天触发器').query }
]
// 最终 URL: https://api.example.com/search?page=1&limit=20&category=tech&keyword=helloJSON 格式示例:
`{
"page": 1,
"limit": 20,
"status": "${$('表单').status}",
"startDate": "${$('代码').formattedDate}"
}`发送请求体 (sendBody)
是否发送请求体(仅 POST、PUT、PATCH 有效)。
默认值: false
请求体内容类型 (bodyContentType)
请求体的 Content-Type。
可选值:
application/json- JSON 格式(目前唯一支持)
默认值: application/json
请求体格式 (specifyBody)
指定请求体的配置格式。
可选值:
keyValuePair- 键值对形式(默认)json- JSON 字符串形式
默认值: keyValuePair
请求体 (body)
HTTP 请求体内容。
字段属性:
- 字符串类型
- 支持表达式
- 通常为 JSON 格式
配置示例:
// 1. 简单 JSON 对象
`{
"name": "${$('实体识别').name}",
"email": "${$('实体识别').email}",
"phone": "${$('实体识别').phone}"
}`
// 2. 嵌套结构
`{
"customer": {
"name": "${$('表单').name}",
"contact": {
"email": "${$('表单').email}",
"phone": "${$('表单').phone}"
}
},
"order": {
"items": ${JSON.stringify($('代码').items)},
"total": ${$('代码').totalAmount}
},
"metadata": {
"source": "automation",
"timestamp": "${new Date().toISOString()}"
}
}`
// 3. 直接使用上游节点的数据
JSON.stringify($('实体识别'))
// 4. 数组格式
`[
{"id": 1, "name": "${$('数据1').name}"},
{"id": 2, "name": "${$('数据2').name}"}
]`高级设置(设置面板)
总是输出 (alwaysOutput)
当请求失败或无响应时,是否输出空项。
默认值: false
用途: 防止工作流在此节点终止。
仅执行一次 (executeOnce)
是否仅使用第一个输入项执行一次。
默认值: false
失败重试 (retryOnFail)
请求失败时是否自动重试。
默认值: false
建议启用场景:
- 网络不稳定
- 外部 API 偶发性失败
- 速率限制导致的 429 错误
最大重试次数 (maxTries)
失败后的最大重试次数。
默认值: 3
前置条件: retryOnFail 必须为 true
重试等待时间 (waitBetweenTries)
每次重试之间的等待时间(毫秒)。
默认值: 1000 (1秒)
前置条件: retryOnFail 必须为 true
建议值:
短暂故障: 500-1000ms
速率限制: 2000-5000ms
服务重启: 5000-10000ms错误处理 (onError)
请求失败时的处理方式。
可选值:
stopWorkflow- 停止整个工作流(默认)continueRegularOutput- 继续执行,使用常规输出continueErrorOutput- 继续执行,使用错误输出
节点描述 (nodeDescription)
为节点添加自定义描述。
nodeDescription: "调用 CRM API 创建客户记录"输出数据
HTTP 请求节点返回完整的响应信息。
// HTTP 状态码
$('HTTP请求').statusCode
// 响应体(通常是 JSON 对象)
$('HTTP请求').body
// 响应头
$('HTTP请求').headers
// 访问响应体中的字段
$('HTTP请求').body.id
$('HTTP请求').body.data.users
$('HTTP请求').body.result[0].name
// 响应头示例
$('HTTP请求').headers['content-type']
$('HTTP请求').headers['x-rate-limit-remaining']工作流示例
示例 1: 创建客户记录
实体识别节点(提取客户信息)
→ HTTP 请求节点
URL: "https://api.crm.com/customers"
方法: POST
身份验证: header_auth
凭证: $('配置').crmApiKey
发送请求头: true
请求头:
- name: "Authorization"
value: `Bearer ${$('配置').crmApiKey}`
- name: "Content-Type"
value: "application/json"
发送请求体: true
请求体:
`{
"name": "${$('实体识别').name}",
"email": "${$('实体识别').email}",
"phone": "${$('实体识别').phone}",
"source": "chatbot",
"tags": ["lead", "automation"]
}`
→ 条件分支
→ [成功: statusCode === 201] → 回答(创建成功)
→ [失败] → 回答(创建失败,请稍后重试)示例 2: 查询订单状态
聊天触发器
→ 实体识别节点(提取订单号)
→ HTTP 请求节点
URL: `https://api.shop.com/orders/${$('实体识别').orderId}`
方法: GET
身份验证: header_auth
发送请求头: true
请求头:
- name: "X-API-Key"
value: $('配置').shopApiKey
发送查询参数: false
→ 代码节点(格式化订单信息)
→ 回答节点示例 3: 批量更新数据
数据库查询节点(获取待更新记录)
→ HTTP 请求节点
URL: "https://api.service.com/batch-update"
方法: POST
发送请求体: true
请求体:
`{
"records": ${JSON.stringify($('数据库查询').results)},
"updateFields": ["status", "updatedAt"],
"batchSize": 100
}`
设置:
retryOnFail: true
maxTries: 3
waitBetweenTries: 2000
→ 条件分支
→ [成功] → 日志记录
→ [失败] → 告警通知示例 4: 文件上传
Webhook触发器(接收文件)
→ HTTP 请求节点
URL: "https://storage.example.com/upload"
方法: POST
发送请求头: true
请求头:
- name: "Content-Type"
value: "multipart/form-data"
- name: "Authorization"
value: `Bearer ${$('配置').storageToken}`
发送请求体: true
请求体:
`{
"file": "${$('Webhook触发器').body.fileBase64}",
"filename": "${$('Webhook触发器').body.filename}",
"folder": "uploads/chatbot"
}`
→ 回答节点
回答: `文件上传成功!访问链接:${$('HTTP请求').body.url}`示例 5: 微服务链式调用
聊天触发器
→ HTTP 请求节点 A(用户服务 - 获取用户信息)
URL: `https://user-service.internal/users/${$('聊天触发器').userId}`
方法: GET
→ HTTP 请求节点 B(订单服务 - 获取订单列表)
URL: "https://order-service.internal/orders"
方法: GET
查询参数:
- name: "userId"
value: $('HTTP请求节点A').body.id
- name: "status"
value: "active"
→ HTTP 请求节点 C(推荐服务 - 获取推荐商品)
URL: "https://recommendation-service.internal/recommend"
方法: POST
请求体:
`{
"userId": "${$('HTTP请求节点A').body.id}",
"orderHistory": ${JSON.stringify($('HTTP请求节点B').body.orders)},
"limit": 5
}`
→ LLM 节点(生成个性化回复)
→ 回答节点示例 6: Webhook 通知
工作流完成节点
→ HTTP 请求节点
URL: $('配置').webhookUrl
方法: POST
发送请求头: true
请求头:
- name: "Content-Type"
value: "application/json"
- name: "X-Webhook-Signature"
value: $('代码').signature
发送请求体: true
请求体:
`{
"event": "workflow.completed",
"workflowId": "${$('工作流信息').id}",
"status": "success",
"result": ${JSON.stringify($('最终结果'))},
"timestamp": "${new Date().toISOString()}"
}`
设置:
retryOnFail: true
maxTries: 5
onError: continueRegularOutput最佳实践
1. 安全处理敏感信息
不要硬编码 API 密钥
// 不要这样做
credentials: "sk-1234567890abcdef"
// 应该使用配置节点或环境变量
credentials: $('配置').apiKey
credentials: $('环境变量').API_SECRET_KEY使用适当的身份验证方式
# 根据 API 要求选择
Basic Auth: 传统 API,用户名密码
JWT: 现代 Web 应用,token 认证
Header Auth: RESTful API,API Key2. 错误处理和重试
合理配置重试策略
# 网络请求
retryOnFail: true
maxTries: 3
waitBetweenTries: 1000
# 关键业务操作
retryOnFail: true
maxTries: 5
waitBetweenTries: 2000
onError: continueErrorOutput # 记录错误但继续检查响应状态
// 使用条件分支检查状态码
条件: $('HTTP请求').statusCode >= 200 && $('HTTP请求').statusCode < 300
// 检查业务状态
条件: $('HTTP请求').body.success === true
// 处理不同错误
条件: $('HTTP请求').statusCode === 404
→ 回答: "未找到相关记录"
条件: $('HTTP请求').statusCode === 429
→ 回答: "请求过于频繁,请稍后重试"
条件: $('HTTP请求').statusCode >= 500
→ 回答: "服务暂时不可用,请稍后重试"3. 性能优化
使用 executeOnce 避免重复请求
# 当上游返回多个项但只需请求一次时
executeOnce: true合理设置超时时间
// 在请求头中设置超时
headers: [
{ name: "X-Timeout", value: "5000" }
]批量操作优化
// 不好:循环调用多次 API
每个用户 → HTTP 请求节点
// 好:批量处理
代码节点(聚合数据)→ HTTP 请求节点(批量 API)4. 数据格式处理
正确构建 JSON 请求体
// 简单对象
`{
"name": "${$('节点').name}",
"age": ${$('节点').age}
}`
// 包含数组
`{
"items": ${JSON.stringify($('节点').items)}
}`
// 转义特殊字符
`{
"description": "${$('节点').text.replace(/"/g, '\\"')}"
}`处理查询参数编码
// 系统会自动进行 URL 编码
queryParams: [
{ name: "search", value: "hello world" } // 自动编码为 hello%20world
]5. 请求头最佳实践
设置合适的 Content-Type
headers: [
{ name: "Content-Type", value: "application/json" },
{ name: "Accept", value: "application/json" }
]添加跟踪标识
headers: [
{ name: "X-Request-ID", value: $('Webhook触发器').requestId },
{ name: "X-Source", value: "automation-workflow" }
]6. 调试技巧
记录请求详情
HTTP 请求节点
→ 代码节点(记录日志)
代码:
function main({request, response}) {
console.log('请求 URL:', request.url)
console.log('状态码:', response.statusCode)
console.log('响应体:', JSON.stringify(response.body))
return {logged: true}
}使用测试端点
// 开发环境使用测试 URL
url: $('环境变量').ENV === 'production'
? 'https://api.example.com/v1'
: 'https://api-dev.example.com/v1'常见问题
Q1: 支持哪些 HTTP 方法?
A: 支持所有常见 HTTP 方法:
- GET - 获取资源
- POST - 创建资源
- PUT - 完整更新资源
- PATCH - 部分更新资源
- DELETE - 删除资源
- HEAD - 获取头信息
Q2: 如何处理 API 速率限制?
A: 处理速率限制的方法:
检查响应头
javascript$('HTTP请求').headers['x-rate-limit-remaining'] $('HTTP请求').headers['x-rate-limit-reset']配置重试策略
yamlretryOnFail: true maxTries: 3 waitBetweenTries: 5000 # 等待 5 秒使用条件分支
javascript条件: $('HTTP请求').statusCode === 429 → 等待节点(延迟执行) → 重新请求
Q3: 如何处理大文件上传?
A: 大文件上传建议:
分块上传
javascript// 使用代码节点分割文件 // 多次调用 HTTP 请求节点上传分块使用预签名 URL
javascript// 先获取预签名 URL HTTP 请求节点 A(获取上传 URL) // 直接上传到云存储 → HTTP 请求节点 B(上传文件)考虑超时设置
- 增加重试等待时间
- 使用流式上传(如果 API 支持)
Q4: 如何发送 multipart/form-data 请求?
A: 当前版本主要支持 JSON 格式。对于 multipart/form-data:
// 方法 1: 使用 base64 编码
body: `{
"file": "${$('节点').fileBase64}",
"filename": "${$('节点').filename}"
}`
// 方法 2: 使用代码节点构建
代码节点(构建 multipart 数据)
→ HTTP 请求节点Q5: 响应不是 JSON 格式怎么办?
A: HTTP 请求节点主要针对 JSON API 优化。对于其他格式:
// 文本响应
$('HTTP请求').body // 字符串形式
// 在代码节点中处理
function main({response}) {
// XML 解析
const parser = new DOMParser()
const xml = parser.parseFromString(response.body, 'text/xml')
// CSV 解析
const rows = response.body.split('\n')
return {parsed: data}
}Q6: 如何处理跨域 (CORS) 问题?
A: CORS 通常是浏览器限制:
服务端到服务端请求
- 工作流在服务端执行,不受 CORS 限制
如果确实遇到 CORS
- 检查目标 API 的 CORS 配置
- 联系 API 提供方添加允许来源
- 使用代理服务
Q7: 如何调试 HTTP 请求?
A: 调试技巧:
使用 webhook.site 测试
javascripturl: "https://webhook.site/your-unique-url" // 查看完整的请求详情记录请求响应
javascriptHTTP 请求节点 → 代码节点 function main({response}) { console.log('Status:', response.statusCode) console.log('Body:', response.body) console.log('Headers:', response.headers) return {debug: true} }使用条件分支检查状态
javascript条件: $('HTTP请求').statusCode !== 200 → 回答节点(显示错误信息)
Q8: 支持自签名证书吗?
A: 通常需要在运行环境配置:
- 生产环境应使用有效的 SSL 证书
- 开发环境可在服务器配置中允许自签名证书
- 不建议在工作流中忽略证书验证
Q9: 如何实现请求缓存?
A: 实现缓存的方式:
// 使用条件分支检查缓存
条件: $('缓存检查').exists === false
→ HTTP 请求节点
→ 代码节点(存储到缓存)
// 或使用 HTTP 头
headers: [
{ name: "Cache-Control", value: "max-age=3600" }
]下一步
- 代码节点 - 处理 HTTP 响应数据
- 条件分支 - 根据响应状态进行分支
- Webhook 触发器 - 接收外部 HTTP 请求