HTTP 请求与代码执行节点
HTTP 请求与代码执行节点
相关源文件
以下文件为本 Wiki 页面的生成提供了上下文:
api/.importlinterapi/core/app/file_access/__init__.pyapi/core/app/file_access/controller.pyapi/core/app/file_access/scope.pyapi/core/helper/code_executor/__init__.pyapi/core/helper/code_executor/code_executor.pyapi/core/helper/code_executor/code_node_provider.pyapi/core/helper/code_executor/javascript/__init__.pyapi/core/helper/code_executor/javascript/javascript_code_provider.pyapi/core/helper/code_executor/javascript/javascript_transformer.pyapi/core/helper/code_executor/jinja2/__init__.pyapi/core/helper/code_executor/jinja2/jinja2_formatter.pyapi/core/helper/code_executor/jinja2/jinja2_transformer.pyapi/core/helper/code_executor/python3/__init__.pyapi/core/helper/code_executor/python3/python3_transformer.pyapi/core/helper/code_executor/template_transformer.pyapi/core/workflow/node_factory.pyapi/core/workflow/node_runtime.pyapi/tests/integration_tests/workflow/nodes/__mock/code_executor.pyapi/tests/integration_tests/workflow/nodes/code_executor/test_code_javascript.pyapi/tests/integration_tests/workflow/nodes/test_code.pyapi/tests/integration_tests/workflow/nodes/test_http.pyapi/tests/integration_tests/workflow/nodes/test_llm.pyapi/tests/integration_tests/workflow/nodes/test_parameter_extractor.pyapi/tests/integration_tests/workflow/nodes/test_template_transform.pyapi/tests/integration_tests/workflow/nodes/test_tool.pyapi/tests/test_containers_integration_tests/__init__.pyapi/tests/test_containers_integration_tests/factories/__init__.pyapi/tests/test_containers_integration_tests/workflow/__init__.pyapi/tests/test_containers_integration_tests/workflow/nodes/__init__.pyapi/tests/test_containers_integration_tests/workflow/nodes/code_executor/__init__.pyapi/tests/test_containers_integration_tests/workflow/nodes/code_executor/test_code_executor.pyapi/tests/test_containers_integration_tests/workflow/nodes/code_executor/test_code_javascript.pyapi/tests/test_containers_integration_tests/workflow/nodes/code_executor/test_code_jinja2.pyapi/tests/test_containers_integration_tests/workflow/nodes/code_executor/test_code_python3.pyapi/tests/unit_tests/core/helper/code_executor/__init__.pyapi/tests/unit_tests/core/helper/code_executor/javascript/__init__.pyapi/tests/unit_tests/core/helper/code_executor/javascript/test_javascript_transformer.pyapi/tests/unit_tests/core/helper/code_executor/python3/__init__.pyapi/tests/unit_tests/core/helper/code_executor/python3/test_python3_transformer.pyapi/tests/unit_tests/core/rag/datasource/test_retrieval_attachment_access.pyapi/tests/unit_tests/core/workflow/graph_engine/test_mock_factory.pyapi/tests/unit_tests/core/workflow/graph_engine/test_mock_nodes.pyapi/tests/unit_tests/core/workflow/graph_engine/test_tool_in_chatflow.pyapi/tests/unit_tests/core/workflow/nodes/answer/test_answer.pyapi/tests/unit_tests/core/workflow/nodes/code/__init__.pyapi/tests/unit_tests/core/workflow/nodes/code/code_node_spec.pyapi/tests/unit_tests/core/workflow/nodes/http_request/test_http_request_executor.pyapi/tests/unit_tests/core/workflow/nodes/http_request/test_http_request_node.pyapi/tests/unit_tests/core/workflow/nodes/template_transform/__init__.pyapi/tests/unit_tests/core/workflow/nodes/template_transform/template_transform_node_spec.pyapi/tests/unit_tests/core/workflow/nodes/test_if_else.pyapi/tests/unit_tests/core/workflow/nodes/test_list_operator.pyapi/tests/unit_tests/core/workflow/nodes/tool/test_tool_node.pyapi/tests/unit_tests/core/workflow/test_node_factory.pyapi/tests/unit_tests/core/workflow/test_node_runtime.py
本文档介绍 Dify 工作流引擎中的 HTTP 请求节点和代码执行节点。这些节点使工作流能够通过 HTTP 与外部服务交互,并在沙箱环境中执行自定义代码逻辑。
HTTP 请求节点架构
HTTP 请求节点支持工作流向外部 API 发起 HTTP 请求,具备模板变量替换、多种认证方式以及全面的安全控制能力。
组件结构
HTTP 请求节点组件架构
来源:api/tests/unit_tests/core/workflow/nodes/http_request/test_http_request_executor.py:7-16, api/tests/unit_tests/core/workflow/nodes/http_request/test_http_request_node.py:14-16, api/tests/unit_tests/core/workflow/nodes/http_request/test_http_request_node.py:119-129
配置与初始化
HTTP 请求节点通过 HttpRequestNodeConfig(定义系统级限制)和 HttpRequestNodeData(包含每个节点的配置)进行配置。
| 配置参数 | 类型 | 用途 | 默认值 |
|---|---|---|---|
max_connect_timeout | int | 最大连接超时时间(秒) | dify_config.HTTP_REQUEST_MAX_CONNECT_TIMEOUT |
max_read_timeout | int | 最大读取超时时间(秒) | dify_config.HTTP_REQUEST_MAX_READ_TIMEOUT |
max_write_timeout | int | 最大写入超时时间(秒) | dify_config.HTTP_REQUEST_MAX_WRITE_TIMEOUT |
max_binary_size | int | 最大二进制响应大小(字节) | dify_config.HTTP_REQUEST_NODE_MAX_BINARY_SIZE |
max_text_size | int | 最大文本响应大小(字节) | dify_config.HTTP_REQUEST_NODE_MAX_TEXT_SIZE |
ssl_verify | bool | 启用 SSL 证书验证 | dify_config.HTTP_REQUEST_NODE_SSL_VERIFY |
ssrf_default_max_retries | int | SSRF 代理的最大重试次数 | dify_config.SSRF_DEFAULT_MAX_RETRIES |
来源:api/tests/unit_tests/core/workflow/nodes/http_request/test_http_request_executor.py:19-27, api/tests/unit_tests/core/workflow/nodes/http_request/test_http_request_node.py:19-27
模板变量替换
HTTP 请求节点支持在 URL、请求头、参数和请求体中使用 {{#node_id.variable#}} 语法进行模板变量替换。
变量解析流程
模板变量解析管线
支持的变量位置
| 位置 | 模板支持 | 示例 |
|---|---|---|
| URL | 是 | https://api.example.com/data |
| 请求头 | 是 | Content-Type: application/json |
| 查询参数 | 是 | A:b |
| JSON 请求体 | 是 | {"number": {{#pre_node_id.number#}}} |
模板处理示例
包含对象变量的 JSON 请求体:
# 来自 test_executor_with_json_body_and_object_variable
node_data = HttpRequestNodeData(
method="post",
url="https://api.example.com/data",
body=HttpRequestNodeBody(
type="json",
data=[BodyData(key="", type="text", value="{{#pre_node_id.object#}}")]
),
...
)
Executor 类会自动处理以下情况:
- 基本类型:替换到 JSON 模板中。
api/tests/unit_tests/core/workflow/nodes/http_request/test_http_request_executor.py:30-56 - 对象:引用时自动序列化为 JSON 对象。
api/tests/unit_tests/core/workflow/nodes/http_request/test_http_request_executor.py:92-112 - 嵌套结构:通过
VariablePool解析深层嵌套的对象。api/tests/unit_tests/core/workflow/nodes/http_request/test_http_request_executor.py:144-180
来源:api/tests/unit_tests/core/workflow/nodes/http_request/test_http_request_executor.py:30-84, api/tests/unit_tests/core/workflow/nodes/http_request/test_http_request_executor.py:86-142
认证方式
HTTP 请求节点通过 HttpRequestNodeAuthorization 支持多种认证类型:
| 认证类型 | 请求头名称 | 配置的请求头值 |
|---|---|---|
no-auth | 无 | 不适用 |
api-key(基本认证) | 用户自定义 | Basic {api_key} |
api-key(自定义) | 用户自定义 | {api_key} |
来源:api/tests/integration_tests/workflow/nodes/test_http.py:103-110, api/tests/integration_tests/workflow/nodes/test_http.py:137-140, api/tests/integration_tests/workflow/nodes/test_http.py:167-174
代码执行节点架构
代码节点支持在工作流中执行 Python、JavaScript 或 Jinja2 代码。它使用基于模板的转换系统,将用户代码准备好后发送到远程沙箱执行。
组件结构
代码执行架构
来源:api/core/helper/code_executor/code_executor.py:50-58, api/core/helper/code_executor/code_executor.py:77-79, api/core/helper/code_executor/template_transformer.py:11-15
沙箱集成
Dify 与专用的沙箱服务通信以执行代码。请求中包含代码、预加载脚本(用于环境设置)以及目标语言。
# 来自 CodeExecutor.execute_code
data = {
"language": cls.code_language_to_running_language.get(language),
"code": code,
"preload": preload,
"enable_network": True,
}
headers = {"X-Api-Key": dify_config.CODE_EXECUTION_API_KEY}
来源:api/core/helper/code_executor/code_executor.py:77-86
模板转换
在将代码发送到沙箱之前,系统会使用 TemplateTransformer 对代码进行转换,以包含输入变量并捕获输出。
- 序列化:输入和代码经过 base64 编码,以防止 shell 注入或语法破坏。
api/core/helper/code_executor/template_transformer.py:17-23 - 运行器脚本:生成一个包装脚本(例如 Python 或 Node.js),该脚本解码输入、调用用户的
main函数,并在<<RESULT>>标签之间打印结果。api/core/helper/code_executor/template_transformer.py:110-116 - 响应解析:执行器提取标签之间的字符串,并将其解析回 Python 字典。
api/core/helper/code_executor/template_transformer.py:39-43
来源:api/core/helper/code_executor/template_transformer.py:26-36, api/core/helper/code_executor/code_executor.py:144-150
安全与连接
SSRF 保护(ssrf_proxy)
ssrf_proxy 模块提供了一种集中式方式来发起出站 HTTP 请求,同时防止服务端请求伪造(SSRF)。它通过 DifyNodeFactory 注入到节点中。
- 客户端池化:使用
get_pooled_http_client管理连接生命周期。api/core/helper/code_executor/code_executor.py:15-16,api/core/helper/code_executor/code_executor.py:95 - SSRF 处理:
graphon_ssrf_proxy在DifyNodeFactory中使用,为节点提供安全的 HTTP 客户端。api/core/workflow/node_factory.py:18,api/core/workflow/node_factory.py:18-87
来源:api/core/workflow/node_factory.py:18-87
代码沙箱限制
CodeNode 对沙箱返回的数据施加限制,以防止内存耗尽或数据传输过多。这些限制在 CodeNodeLimits 中定义。
| 限制项 | 配置变量 | 用途 |
|---|---|---|
max_string_length | CODE_MAX_STRING_LENGTH | 输出中任何单个字符串的最大长度 |
max_number | CODE_MAX_NUMBER | 最大数值 |
max_depth | CODE_MAX_DEPTH | 对象/数组的最大嵌套深度 |
max_precision | CODE_MAX_PRECISION | 数字的最大小数精度 |
来源:api/core/workflow/node_factory.py:52
测试与模拟
系统包含针对这两种节点类型的广泛集成测试,使用了模拟工厂和提供者。
- HTTP 模拟:使用
setup_http_mock在集成测试中验证 GET/POST 行为和请求头处理。api/tests/integration_tests/workflow/nodes/test_http.py:92-93 - 认证验证:专门测试自定义认证模式在缺少凭证时是否会引发
AuthorizationConfigError。api/tests/integration_tests/workflow/nodes/test_http.py:193-202 - 响应解析:测试确保
Executor能够正确地从VariablePool解析 JSON 请求体,包括嵌套结构。api/tests/unit_tests/core/workflow/nodes/http_request/test_http_request_executor.py:144-180 - 节点工厂集成:
DifyNodeFactory负责实例化这些节点,并注入所需的依赖项,如HttpClientProtocol和ToolFileManager。api/core/workflow/node_factory.py:24-33
来源:api/tests/integration_tests/workflow/nodes/test_http.py:92-202, api/tests/unit_tests/core/workflow/nodes/http_request/test_http_request_executor.py:144-180, api/core/workflow/node_factory.py:24-33