资讯动态

HTTP 接口只给一页、参数写死天天改?DataY 自动分页 + 动态参数

发布时间:2026/10/22 20:58:43 来源:尧图企业网站定制
HTTP 接口只给一页、参数写死天天改DataY 自动分页 动态参数自动分页把每一页都拉全动态参数每次执行都自动更新配合自动建表一个 ETL 任务全搞定。01 一个很常见的场景业务系统提供了查询接口数据在接口里报表却还在 Excel 里。一开始大家想得很简单写个脚本定时请求一下把结果写进数据库不就行了真正动手之后才发现问题一个接一个接口一页只返回 10 条只调一次永远拿不全查询条件里要传时间范围脚本里的时间写死了第二天就查不到新数据请求头里带着 token换环境、换账号就要改返回的 JSON 层层嵌套真正要写入表的数据藏在std_data.result.rows里目标表还没有字段类型、建表语句都要自己处理最怕的是脚本跑完了你以为同步成功了其实只同步了第一页。这类“接口到数据库”的同步本质上是 ETL 里非常典型的一类场景HTTP 作为数据源数据库作为目标端。如果每个接口都手写一套脚本维护成本会越来越高。更合理的方式是把接口调用、分页循环、时间参数、字段解析、写库这些动作变成可配置、可复用、可调度的 ETL 任务。这篇文章就以一个真实的外包交付查询接口为例看看 DataY 是怎么把这件事做完整的。02 为什么 HTTP 接口同步“看起来简单做起来坑”数据库同步通常有现成的连接器表结构、增量字段、分页都能交给工具处理。HTTP 接口则不一样它更像“半结构化数据源”接口协议不统一有的用 GET有的用 POST有的参数在 URL 上有的在 JSON Body 里鉴权可能在 Header也可能在 Cookie。返回结构不统一数据可能直接是一个数组也可能藏在data.list、result.rows、std_data.result.rows里。分页方式不统一有的用page_no/page_size有的用offset/limit有的用cursor。时间条件必须动态今天的任务应该取“昨天”的数据而不是脚本里写死的某一天。写完还要能调度、能重试、能看日志脚本能跑通只是第一步稳定运行才是长期问题。所以一个真正可用的 HTTP 同步任务至少要把下面几件事做好请求可配置URL、方法、Header、Body参数可动态替换页码、每页条数、时间范围分页可循环一页一页拉直到取完响应可解析从嵌套 JSON 中提取数据数组目标可写入自动建表、批量写入、支持追加/覆盖/更新过程可观测有日志、有执行实例、有失败重试。03 DataY 的解法两个组件就够了在 DataY 里一个最简的“HTTP 同步到 MySQL”任务只需要两个节点HttpInvoke ──▶ StreamJdbcOutput 调用接口 写入 MySQLHttpInvoke负责发请求、解析响应、支持分页循环StreamJdbcOutput负责把数据写入关系型数据库支持自动建表和多种写入策略。任务设计器里拖两个组件、连一条线再把接口参数填进去一个可调度的 ETL 任务就成型了。下面用实际配置一步步拆开。04 第一步把 cURL 变成 ETL 配置业务方给的原始命令大概是这样curl--location--requestPOSThttps://your-api-gateway.example.com\--headerdigi-service: {name:yz.oapi.outsourcing.delivery.query}\--headerdigi-user-token: YOUR_TOKEN\--headerContent-Type: application/json\--data{ std_data: { parameter: { page_no: 1, use_has_next: true, page_size: 10 } } }在 DataY 的 HttpInvoke 配置里可以直接“从 cURL 导入”也可以手动填写请求 URLhttps://your-api-gateway.example.com请求方法POST请求头Content-Type、digi-service、digi-user-token请求体接口要求的 JSON数据路径$.std_data.result.rows这里的数据路径很关键。接口返回的 JSON 通常不是直接一个数组而是类似{std_data:{parameter:{page_no:1,page_size:10},result:{rows:[{id:1,docNo:DOC-0001,entry_time:2026-10-18 12:00:00}]}}}真正要写库的是rows所以数据路径填$.std_data.result.rows。DataY 会把它提取成数组并根据字段自动推断表结构。05 分页让${pageNo}自己往前走只调一次接口最多只能拿到第一页。要拿全量数据必须开启分页循环。在 HttpInvoke 的分页配置里只需要几项起始页码1每页条数10最大页数1000防止接口忽略分页参数导致死循环请求间隔100ms对接口友好一点请求体里用占位符表示页码和每页条数{std_data:{parameter:{page_no:${pageNo},use_has_next:true,page_size:${pageSize}}}}注意${pageNo}和${pageSize}在 JSON 里是数字占位不是字符串。DataY 在每次请求前会把它们替换成当前页码和每页条数。分页什么时候停DataY 的判断很直接当前页返回的条数小于pageSize说明已经是最后一页如果返回空数组也直接停止。例如pageSize 10第 1 页返回 10 条 → 继续第 2 页返回 10 条 → 继续第 3 页返回 5 条 → 小于 10停止如果总数刚好是 20 条则第 3 页会返回空数组同样停止。这里有一个小细节当总数刚好是pageSize的整数倍时会多请求一次空页来确认结束。这是正常的也是这种判断方式最简单、最稳妥的地方。每一页数据都会作为独立的 FlowFile 向下游发送边拉取边写入不会把全量数据一次性堆在内存里。数据量大时这一点非常重要。06 时间参数化一次求值全页复用接口查询通常都要带时间范围。最忌讳的写法是把日期写死value:2026-10-18 00:00:00第二天任务再跑还在查昨天之前的旧数据。DataY 支持在请求体里直接写动态时间表达式例如{field_name:entry_time,operator:,value:#{NOW - 1d, yyyy-MM-dd} 00:00:00}{field_name:entry_time,operator:,value:#{NOW - 1d, yyyy-MM-dd} 23:59:59}#{NOW - 1d, yyyy-MM-dd}会在任务执行时计算成“昨天”的日期。今天跑取昨天明天跑自动变成新的昨天不需要改配置。除了“昨天”还可以按需组合今天#{NOW, yyyy-MM-dd} 00:00:00最近 24 小时#{NOW - 1d, yyyy-MM-dd HH:mm:ss}到#{NOW, yyyy-MM-dd HH:mm:ss}最近 7 天#{NOW - 7d, yyyy-MM-dd} 00:00:00本月第一天#{THIS_MONTH_FIRST_DAY}更重要的是分页任务开始时时间表达式只会求值一次后续所有页复用同一个时间范围。为什么这一点很重要假设任务从 23:59:58 开始跑第 1 页还在取“昨天”翻到第 2 页时刚好跨过零点。如果每页都重新计算时间后面的页可能就跑到“今天”去了数据范围前后不一致排查起来非常痛苦。一次求值、全页复用才能保证整个分页过程查的是同一个时间窗口。07 写入 MySQL自动建表按需选择写入策略HttpInvoke 提取出rows后下游的 StreamJdbcOutput 负责写库。配置项也很直接数据源选择目标 MySQL表名例如yz_outsourcing_delivery写入策略append、overwrite或update批处理数例如20000。如果目标表不存在DataY 会根据接口返回的数据自动推断字段和类型并生成建表语句。第一次跑任务时自动建表后续页继续追加整个过程不需要手工写 DDL。对于增量同步建议配合业务主键使用update策略或者在入库后做去重避免任务重试时产生重复数据。08 写在最后HTTP 接口同步看起来只是“调个接口、写个库”但要做到稳定、完整、可维护背后其实是一整套 ETL 能力请求配置分页循环动态参数JSON 解析自动建表批量写入调度与日志。DataY 把这些能力收进了一个轻量平台里。一个 JAR 启动拖两个组件配好参数就能把接口数据稳定地同步到 MySQL。更重要的是任务不是“一次性脚本”而是可以被调度、被复用、被导出的标准 ETL 任务。今天对接外包交付查询明天对接订单、库存、财务接口只需要换 URL、Header 和 Body剩下的分页、时间参数、写库逻辑都可以复用。如果你也正在被“接口有数据、平台进不来”困扰不妨从一个最简单的 HTTP 到 MySQL 任务开始。先把第一页拿全再把每一页拿稳。09 DataY 是什么上面这套链路跑在DataY上。它是一个开源、轻量的一体化数据平台目标很直接用尽量小的资源把数据集成、任务调度、数仓和指标分析这几件事跑通。这里的“轻量”指的是运行资源门槛低用尽量少的机器、内存和人力投入就能完成数据平台建设——而不是能力轻量。数据平台该有的功能它都有数据集成、维度建模、任务调度、高性能数仓、智能问数一样不缺。它不依赖 Hadoop、Spark 这类重型组件一个 JAR 就能启动默认内嵌 DuckDB 作为高性能分析引擎。开发机 2 核 4G 就能跑通从数据接入到报表查询的完整链路部署和维护成本都比较低。它由两块组成模块定位说明DataY Core数据集成引擎轻量、可嵌入、可扩展、流批一体JSON 定义任务、自动建表、CDC 实时同步可脱离 Web 独立运行或嵌入 Java 应用DataY Web可视化数据平台拖拽式任务设计、任务调度、维度建模、指标管理、智能问数目前 DataY 覆盖五块核心能力数据集成、维度建模、任务调度、高性能数仓和智能问数。数据集成方面支持 MySQL、PostgreSQL、Oracle、SQL Server、Doris、ClickHouse、DuckDB、DuckLake 等十余种数据源也支持 MySQL CDC、PostgreSQL CDC、Oracle CDC 等实时同步场景。任务既可以在可视化画布上拖拽编排也可以用 JSON 配置文件定义。HTTP 接口同步就是其中一个很典型的场景把接口调用、分页循环、参数替换、JSON 解析、字段映射和写库这些动作收敛成一个可配置、可调度、可复用的 ETL 任务而不是散落在各个脚本里。快速开始gitclone https://gitee.com/yuyuejia/datay.gitcddatay mvn clean package-DskipTestsjava-jardatay-web/target/*.jar--DATAY_AI_API_KEYsk-xxxxxxxxx# 浏览器打开 http://localhost:8080默认账号 admin/admin产品首页http://datay.yuyuejia.com.cn/项目地址https://github.com/yuyuejia/datay

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑