首页 > 解决方案 > 在 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 的原因是它是我所知道的唯一编程。

试图

(基于this question and answer

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

结果

除第一页和最后一页外,所有页面都按预期导出:

参考

返回的分页 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
}

感谢您的任何建议或想法。

标签: jsonbashapicurljq

解决方案


假设我关于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

推荐阅读