Как получить несколько страниц с помощью UrlFetchApp? - PullRequest
0 голосов
/ 09 июля 2020

Мне нужно получить все контакты из Moneybird api. Но существует ограничение на 50 или 100 контактов на странице.

Это добавляется в заголовок, если есть следующая страница https://moneybird.com/api/v2/270942000047355483/contacts.json?page=2; rel = "next"

Как может il oop работать над страницами с помощью UrlfetchApp в скрипте приложений Google? или лучший способ?

Спасибо за вашу помощь!

function listAllContacts() {
  
  var options = {
    'method': 'GET',
    'contentType': 'application/json',
    'muteHttpExceptions': false,
    'headers': {
      'Authorization': 'Bearer ' + SERVICE.getAccessToken()
    },
  };
  
  var url = 'https://moneybird.com/api/v2/'+ADMIN_ID+'/contacts.json';
  
  var response = UrlFetchApp.fetch(url,options);
  var headers = response.getAllHeaders();
  var link = headers["Link"];
  // Check if there is a rel='next'? then fetch next page
  
  var data = JSON.parse(response.getContentText());
  var resonseCode = JSON.parse(response.getResponseCode());
  console.log(resonseCode);
  console.log(data);
  
  
  return data;
  
}```

1 Ответ

2 голосов
/ 10 июля 2020

Я считаю, что ваша цель следующая.

  • Вы хотите получить все страницы, используя l oop из URL-адреса https://moneybird.com/api/v2/'+ADMIN_ID+'/contacts.json.

  • В официальном документе «Разбиение на страницы» написано следующим образом:

    Конечные точки, возвращающие список объектов, разбиты на страницы, чтобы предотвратить большие ответы. Для управления разбивкой на страницы вы можете использовать параметры page и per_page. page определяет, какую страницу возвращать (по умолчанию: 1), per_page контролирует количество возвращаемых сущностей (по умолчанию: 50, максимум: 100). Каждый ответ с разбивкой на страницы содержит заголовок Link с информацией о предыдущей и следующей странице:

          Link: <https://moneybird.com/api/v2/contacts.json?page=3>; rel="next",
              <https://moneybird.com/api/v2/contacts.json?page=1>; rel="prev"
    

Из приведенной выше ситуации я подумал, что на последней странице rel="next" может не быть включен. Используя это, я хотел бы предложить следующий модифицированный сценарий.

Измененный сценарий:

function listAllContacts() {
  var options = {
    'method': 'GET',
    'contentType': 'application/json',
    'muteHttpExceptions': false,
    'headers': {
      'Authorization': 'Bearer ' + SERVICE.getAccessToken()
    },
  };
  var url = 'https://moneybird.com/api/v2/'+ADMIN_ID+'/contacts.json';
  
  // I modified below script.
  var results = [];
  do {
    var response = UrlFetchApp.fetch(url,options);
    var data = JSON.parse(response.getContentText());
    results.push(data);
    var resonseCode = JSON.parse(response.getResponseCode());
    console.log(resonseCode);
    console.log(data);
    
    var headers = response.getAllHeaders();
    var link = headers["Link"];
    var checkNextUrl = link.includes("next");
    if (checkNextUrl) url = link.split(";")[0].match(/<(\w.+)>/)[1];
  } while (checkNextUrl);
  return results;
}

Примечание:

  • К сожалению, из вашего вопроса я не смог Я не понимаю значений ответа от API. В этом случае значения ответа помещаются в массив results. Об этом, пожалуйста, измените его для вашей реальной ситуации.
  • Из официального документа, чтобы уменьшить количество l oop, использование per_page в URL-адресе может быть полезным.
  • Когда мое предположение оказалось неверным, можете ли вы предоставить заголовки ответов на последней странице? Этим я хотел бы подтвердить это.

Ссылка:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...