使用cURL和Bash将来自分页REST API调用的所有对象包含在单个JSON文件中。此合并列表将被送入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
尝试了多种变体,但仍然失败。list":null
和next":null
都没有结束循环。该脚本会无限期地导出增量的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
}
谢谢您的任何建议或想法。
答案 0 :(得分:1)
假设我关于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