Apache DolphinScheduler HTTP 任务节点实战:请求配置、响应校验与输出参数全解析
【免费下载链接】dolphinschedulerApache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code项目地址: https://gitcode.com/GitHub_Trending/dol/dolphinscheduler
HTTP 任务节点是 Apache DolphinScheduler 中用于执行 HTTP 类型任务的内置节点,它支持 GET、POST、PUT、DELETE 四种请求方法,并内置"响应校验"能力,让工作流中的接口调用既能发请求、也能验证返回结果。本文以 HTTP 任务官方文档 为主体,结合仓库中dolphinscheduler-task-http插件的源码实现,完整讲解该节点的参数配置、输出参数用法、校验逻辑的底层原理与可落地的任务样例,帮助你快速在 DAG 中接入接口调用类任务。
HTTP 任务节点综述
该节点用于执行 HTTP 类型的任务,除了发起请求之外,还支持对 HTTP 响应做校验(如默认响应码、自定义响应码、内容包含、内容不包含),因此既可以承担"调用外部 API"的职责,也可以作为工作流中的接口健康检查、数据提交、系统联动等环节。
从源码结构看,HTTP 任务是一个标准的 DolphinScheduler 任务插件,其核心实现位于 dolphinscheduler-task-http 插件目录 下,主要包含:
- HttpTask.java:任务执行主逻辑,负责发请求与校验响应;
- HttpParameters.java:参数模型,对应任务表单中的各配置项;
- HttpCheckCondition.java:校验条件枚举;
- HttpRequestMethod.java:请求方法枚举(GET/POST/PUT/DELETE)。
创建 HTTP 任务
在 DolphinScheduler 的 Web UI 中创建 HTTP 任务的步骤如下:
- 点击
项目管理 -> 项目名称 -> 工作流定义,点击"创建工作流"按钮,进入 DAG 编辑页面; - 从工具栏拖动
HTTP 任务节点到画板中;
- 双击节点,在弹出的任务配置面板中填写请求地址、请求类型、请求参数、校验条件等参数;
- 配置完成后,将该节点与上游/下游任务连线,保存并发布工作流。
任务参数详解
HTTP 任务节点的参数分为两类:一类是所有任务共有的默认参数,一类是 HTTP 特有的任务参数。
默认任务参数
任务名称、运行标志、缓存执行、描述、任务优先级、Worker 分组、任务组名称、组内优先级、环境名称、失败重试次数、失败重试间隔、CPU 配额、最大内存、超时告警、资源、前置任务、延时执行时间等通用配置,请参考 DolphinScheduler 任务参数附录 的"默认任务参数"一栏,此处不再赘述。
HTTP 特有任务参数
| 任务参数 | 描述 |
|---|---|
| 请求地址 | http 请求 URL |
| 请求类型 | 支持 GET、POST、PUT、DELETE |
| 请求参数 | 支持 Parameter、Body、Headers 三种类型 |
| 校验条件 | 支持默认响应码、自定义响应码、内容包含、内容不包含 |
| 校验内容 | 当校验条件选择自定义响应码、内容包含、内容不包含时,需填写校验内容 |
| 自定义参数 | 是 http 局部的用户自定义参数,会替换脚本中以${变量}的内容 |
从源码角度进一步解读这些参数:在 HttpParameters.java 中,url对应请求地址;httpMethod对应请求类型(枚举值见 HttpRequestMethod.java,仅支持 GET、POST、PUT、DELETE);httpParams对应请求参数列表,列表中的每一项通过httpParametersType区分为 Parameter 或 Headers 两种类型(见 HttpParametersType.java),Body 则单独存放于httpBody字段;httpCheckCondition与condition对应校验条件与校验内容。
需要注意,HttpParameters.checkParameters() 的合法性校验要求:URL 非空、请求方法非空且连接超时时间connectTimeout大于 0,否则任务初始化阶段会直接抛出"http task params is not valid"异常。
任务输出参数:response
HTTP 任务会将其请求返回结果作为输出参数暴露给下游任务使用:
| 任务参数 | 描述 |
|---|---|
| response | VARCHAR,HTTP 请求返回结果 |
下游任务可以使用${taskName.response}引用该输出参数。例如,当前 task1 为 HTTP 任务,下游任务可以使用${task1.response}引用 task1 的输出参数。
输出参数的生成逻辑在 HttpTask.addDefaultOutput() 中:任务将响应体封装为一个名为{taskName}.response的Property,类型为VARCHAR、方向为OUT,并写入参数池(var pool)。也就是说,只要上游 HTTP 任务执行成功,下游任务无论是什么类型,都可以通过${task1.response}拿到该任务的完整响应内容,典型的应用场景包括:由 HTTP 任务获取接口返回值,再交给后续的 Shell、Python 或 SQL 任务做进一步处理。
任务样例:使用 POST 向登录页面提交数据
HTTP 定义了与服务器交互的不同方法,最基本的方法有 4 种:GET、POST、PUT、DELETE。这里我们使用 HTTP 任务节点,演示使用 POST 向系统的登录页面发送请求、提交数据。
主要配置参数如下(以下参数均可通过内置参数替换,例如使用${task1.response}、${today}等):
- URL:访问目标资源的地址,这里为系统的登录页面;
- 请求类型:GET、POST、PUT、DELETE;
- Headers:请求头信息。当前仅支持
application/json、application/x-www-form-urlencoded两种格式,如果输入其他格式,默认会使用application/json格式。从源码看,HttpTask.getContentType() 会从 Headers 列表中查找Content-Type(定义于 HttpConstants.java),若未找到或值不合法,则回退为application/json;而 Headers 中的Content-Type项会被 getHeaders() 过滤掉,不参与普通请求头的拼装; - HTTP Parameters:GET、DELETE 请求参数;
- HTTP Body:POST、PUT 请求参数;
- 校验条件:默认响应码 200、自定义响应码、内容包含、内容不包含;
- 校验内容:当校验条件为自定义响应码、内容包含、内容不包含时,需填写校验内容,校验内容为模糊匹配。
关于 HTTP Body 的格式,HttpTask.getRequestBody() 会将 Body 先解析为 JSON 节点,要求必须是合法的 JSON 对象,否则抛出Http request body should be a json object异常。因此填写 Body 时应使用形如{"username":"admin","password":"******"}的 JSON 格式。
校验条件的底层实现:四种模式如何判定任务成败
校验条件是 HTTP 任务区别于普通"发个请求"的关键能力。四种校验模式的枚举定义在 HttpCheckCondition.java 中,而判定逻辑实现在 HttpTask.validateResponse(),具体规则如下:
- STATUS_CODE_DEFAULT(默认响应码):要求响应状态码为 200(即 HttpConstants.RESPONSE_CODE_SUCCESS),这也是校验条件未显式配置时的默认值;
- STATUS_CODE_CUSTOM(自定义响应码):要求实际状态码与"校验内容"中填写的数字完全相等(
Integer.parseInt(condition)),仅支持单个整数; - BODY_CONTAINS(内容包含):响应体非空,且必须包含"校验内容"中填写的子串(模糊匹配);
- BODY_NOT_CONTAINS(内容不包含):响应体非空,且不能包含"校验内容"中填写的子串。
任何一条规则不满足,任务都会以失败状态结束(EXIT_CODE_FAILURE),并输出包含 URL、状态码、校验条件与响应体的错误日志;全部满足则记录成功日志并以成功状态结束。仓库中的测试用例 HttpTaskTest.java 使用 MockWebServer 分别对四种 HTTP 方法、成功与失败的校验路径进行了覆盖验证,可作为理解各校验分支行为的参考。
HTTP 请求的底层执行原理
HTTP 任务的请求由 HttpTask.sendRequest() 根据请求类型分发到对应的发送方法:GET 走sendGetRequest()、POST 走sendPostRequest()、PUT 走sendPutRequest()、DELETE 走sendDeleteRequest(),底层统一通过 DolphinScheduler 公共模块封装的 OkHttp 工具(OkHttpUtils)发起请求。
几个值得注意的实现细节:
- GET/DELETE 与 POST/PUT 的参数位置不同:GET、DELETE 请求的参数以 Parameter 形式拼接进 URL(见
getRequestParams()),而 POST、PUT 的参数以 Body 形式携带(见getRequestBody()); - 超时时间:
connectTimeout参数(单位毫秒)同时作用于连接、读取等环节,且在参数校验时要求必须大于 0; - 参数占位符替换:无论是 Headers、Parameter 还是 Body 中的值,都会经过
ParameterUtils.convertParameterPlaceholders()做${变量}占位符替换(见 HttpTask.java),因此 URL、请求头、参数值、Body 中都可以引用工作流级/任务级的自定义参数或内置参数,实现"一套模板、动态取值"。
小结
HTTP 任务节点让"调用接口"成为 DolphinScheduler 工作流中的一等公民:通过四种请求方法覆盖常见的 RESTful 调用场景,通过四种校验条件把"接口是否正常"固化为任务成败的判定标准,通过${taskName.response}输出参数实现跨任务的数据传递,再配合内置参数与自定义参数的占位符替换,足以胜任接口触发、健康检查、系统联动等绝大多数 HTTP 集成需求。若需进一步了解该任务的源码与测试细节,可深入阅读 dolphinscheduler-task-http 插件 目录,或参考 HTTP 任务官方文档 与 任务参数附录。
【免费下载链接】dolphinschedulerApache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code项目地址: https://gitcode.com/GitHub_Trending/dol/dolphinscheduler
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考