Цель
Включение всех объектов из разбитого на страницы вызова REST API в одном файле JSON с использованием cURL и Bash. Этот объединенный список будет включен в отчет Power BI.
Подробнее
Запрос возвращает максимум 100 объектов. Всего более 400 объектов. Общее количество растет со временем. Я не хочу поддерживать скрипт, который включает в себя что-то вроде for set in 0 100 200 300 400 ; do
, потому что он требует, чтобы я вручную сопоставлял наборы с текущим количеством объектов. Чтобы сэкономить трудозатраты, я бы хотел, чтобы скрипт автоматически определял, когда была обработана последняя страница, а затем разрывался.
Для достижения моей цели план, который я до сих пор составлял, состоит в том, чтобы извлечь каждый инкрементальный набор из 100 элементов в свой собственный файл JSON, затем собрать их с помощью cat
и извлечь соответствующие ключи / значения JSON с помощью JQ. Причина 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
}
Спасибо за любые советы или идеи.