Windows下用cmd脚本调用CURL获取API全量数据的求助
解决API分页数据全量获取问题(CMD + CURL)
看起来你的API做了分页限制,单次请求只返回第一页的数据(刚好对应2017-10-01的内容),而非日期范围的问题。你提到的X-Total-Pages响应头正是分页机制的核心,我们可以基于它编写循环脚本,自动遍历所有页面并合并数据。
步骤1:确认分页参数与总页数
首先运行带-I参数的CURL命令,查看API返回的分页相关响应头:
curl -s -I "https://SITE.fr/data/v1/connections?since=2017-10-01&until=2017-10-09" --header "Authorization:$TOKEN"
你会看到类似这样的响应头:
X-Total-Pages: 5 X-Page: 1 X-Per-Page: 1000
X-Total-Pages:数据总页数X-Per-Page:每页默认返回的条目数(如果API支持,可添加&limit=2000参数调整每页数量,减少请求次数)
步骤2:编写CMD循环脚本
下面是完整的CMD脚本,它会自动获取总页数、遍历每一页并将数据合并为一个有效的JSON文件:
@echo off setlocal enabledelayedexpansion :: 配置基础参数 set "TOKEN=你的实际令牌内容" set "BASE_URL=https://SITE.fr/data/v1/connections?since=2017-10-01&until=2017-10-09" set "OUTPUT_FILE=F:\ADRESS\file.json" set "PER_PAGE=1000" :: 可选:根据API支持调整每页条目数 :: 1. 获取数据总页数 for /f "tokens=2 delims=: " %%a in ('curl -s -I "%BASE_URL%&limit=!PER_PAGE!" -H "Authorization:!TOKEN!" ^| findstr /i "X-Total-Pages"') do ( set "TOTAL_PAGES=%%a" ) echo 共需获取 !TOTAL_PAGES! 页数据... :: 2. 初始化输出文件(创建空JSON数组) echo [ > "!OUTPUT_FILE!" :: 3. 循环遍历每一页 for /l %%p in (1,1,!TOTAL_PAGES!) do ( echo 正在获取第 %%p 页... set "PAGE_URL=!BASE_URL!&limit=!PER_PAGE!&page=%%p" :: 处理JSON格式,确保最终文件是有效数组 if %%p equ 1 ( :: 第一页保留完整数组结构 curl -s "!PAGE_URL!" -H "Authorization:!TOKEN!" >> "!OUTPUT_FILE!" ) else ( :: 后续页面去掉首尾的[],只保留数组元素 curl -s "!PAGE_URL!" -H "Authorization:!TOKEN!" ^| findstr /v /c:"[" /c:"]" >> "!OUTPUT_FILE!" :: 添加逗号分隔元素(若最后一页有多余逗号,可手动删除或调整逻辑) echo, >> "!OUTPUT_FILE!" ) ) :: 4. 闭合JSON数组 echo ] >> "!OUTPUT_FILE!" echo 所有数据已成功保存到 !OUTPUT_FILE! endlocal
关键细节说明
- 延迟扩展:
setlocal enabledelayedexpansion是为了在循环中正确读取和修改变量值 - JSON合并逻辑:因为每页返回独立的JSON数组,我们保留第一页的
[,后续页去掉首尾括号,最后添加],确保整个文件是有效的JSON数组 - 速率限制处理:如果API有请求频率限制,可在循环中添加
timeout /t 1 /nobreak(延迟1秒),避免被临时封禁 - 分页参数适配:如果API的分页参数不是
page(比如用offset),需要修改PAGE_URL为&offset=%%p*!PER_PAGE!
关于最大行数参数的补充
有些API支持limit参数设置每页最大条目数,比如&limit=2000000,但大多数API会有上限(比如1000或5000),因此分页循环是更可靠的全量获取方案。如果你的API允许设置足够大的limit,可以尝试单次请求获取全量数据,但需要先测试是否生效。
内容的提问来源于stack exchange,提问作者Luderic
相关产品推荐
相关产品推荐

