json - 在 Bash 循环中检测分页 cURL 响应的最后一页
问题描述
目标
使用 cURL 和 Bash 在单个 JSON 文件中包含来自分页 REST API 调用的所有对象。此组合列表将输入到 Power BI 报告中。
细节
一个请求最多返回 100 个对象。总共有 400 多个对象。总量随时间增长。我不想维护一个包含类似内容的脚本,for set in 0 100 200 300 400 ; do
因为它需要我手动将集合与当前的对象数量进行匹配。为了节省劳动力,我想要一个脚本来自动检测最后一页何时被处理然后中断。
为了实现我的目标,到目前为止我提出的计划是将每个增量集(包含 100 个项目)提取到其自己的 JSON 文件中,然后cat
使用 JQ 将它们组装并提取相关的 JSON 键/值。Bash 的原因是它是我所知道的唯一编程。
试图
for ((i=0; ; i+=100)); do
contents=$(curl -u "username:password" -H "Content-Type: application/json" "https://<url>/api/core/v3/places?count=100&startIndex=$i")
echo "$contents" > $i.json
if [[ $contents =~ 'list" : [ ]' ]]
then break
fi
done
结果
除第一页和最后一页外,所有页面都按预期导出:
- 第一个
startIndex
应该是0
,但代码使startIndex
100
. 我已经尝试了许多变化,i
但仍然失败。 - [编辑:已解决,谢谢@weirdan] 既不
list":null
也不next":null
结束循环。该脚本无限期地导出递增的 JSON 文件。~
参考
返回的分页 JSON 的第一页
{
"itemsPerPage" : 100,
"links" : {
"next" : "https://<url>/api/core/v3/places?sort=titleAsc&count=100&startIndex=0" <--- with my script, startIndex is erroneously 100
},
"list" : [ {
...
中间页面
{
"itemsPerPage" : 100,
"links" : {
"previous" : "https://<url>/api/core/v3/places?sort=titleAsc&count=100",
"next" : "https://<url>/api/core/v3/places?sort=titleAsc&count=100&startIndex=200"
},
"list" : [ {
...
最后一页
{
"itemsPerPage" : 100,
"links" : {
"previous" : "https://<url>/api/core/v3/places?sort=titleAsc&count=100&startIndex=400"
},
"list" : [ {
...
空白页
{
"itemsPerPage" : 100,
"list" : [ ],
"startIndex" : 500
}
感谢您的任何建议或想法。
解决方案
假设我关于startIndex
成立的理论并实施@CharlesDuffy 的关于 的建议jq
,这就变成了
for ((i=0; ; i+=100)); do
contents=$(curl -u "username:password" -H "Content-Type: application/json" "https://<url>/api/core/v3/places?count=100&startIndex=$i")
echo "$contents" > $i.json
if jq -e '.list | length == 0' >/dev/null; then
break
fi <<< "$contents"
done
推荐阅读
- javascript - $$.eval 之后的 Puppeteer 点击功能
- java - Firebase - 如何在firebase中插入多个相同的孩子
- https - 客户端在进行 https 握手时如何知道服务器证书使用哪个 CA?
- javascript - 1法中优化这4法
- python-3.x - 在 Tkinter 标签内循环 OpenCV 图像 - 使用 esp32-cam
- branch.io - 分支自定义域 SSL
- azure-data-factory - ADF V2 管道的自动化
- python - 如何使用 Python OpenCV 中的坐标在图像中绘制热图?
- bash - 仅当包版本与 Git 主分支上的标记匹配时才推送 nuget 包
- julia - 我想格式化日期,我们现在只有 yyyyq ,我想得到 YYYY-MM-DD