Определите последнюю страницу разбитого на страницы ответа cURL в цикле Bash - PullRequest
0 голосов
/ 30 августа 2018

Цель

Включение всех объектов из разбитого на страницы вызова 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
}

Спасибо за любые советы или идеи.

1 Ответ

0 голосов
/ 30 августа 2018

Если предположить, что моя теория о startIndex удерживает воду и реализовать предложение Чарльза Даффи о 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
...