【问题标题】:Incremental offset in Api callApi 调用中的增量偏移量
【发布时间】:2020-02-27 03:34:57
【问题描述】:

调用api时需要获取所有结果。我只有100个。 我知道我必须每 100 次抵消才能获得全部。不知道总共有多少结果。 我想我应该使用“while”,直到 api 说没有更多的结果......或类似的东西......但我是 javascript 的初学者,所以我不知道把它放在哪里方便以及如何实施它。 我正在使用 Google App Scripts 在 Google 表格中插入结果。 我尝试使用“while”函数,但我不知道它是否是实现它的正确位置..以及变量是否正常。见 //Loop 注释 这是我的代码:

var APIurl = 'http://api.elit.com.ar/productos?offset=';
var offset = 0

function callAPI() {
  //Access Data
 var token = Utilities.base64Encode('mytoken');

  var auth =  {
    user_id: 'myid',
    token: token,}    

  var options = {
    muteHttpExceptions: true,
    method: 'POST',
    payload: JSON.stringify(auth),
    }

  // Call API
  var response = UrlFetchApp.fetch(APIurl, options);

  //Parse response
  var json= response.getContentText();
  return JSON.parse(json)
}  

function displayData(){

  var data = callAPI();
  var results = data["resultado"];
  var output = []

  results.forEach(function(elem,i) {
  output.push([elem["cod_alfa"],elem["detalle"],elem["precio"]]);
  });

  //Loop
  while (results !== null){
  callAPI(APIurl + offset + 100);
  };

  //Clear previous content
  var ss = SpreadsheetApp.openByUrl('mygooglesheeturl').getSheetByName('sheetname');
  ss.getRange(1,1,500,3).clearContent();

  //Insert new data in sheet
  var len = output.length;
  ss.getRange(1,1,len,3).setValues(output);
  Logger.log(output);


}

【问题讨论】:

  • 您有 API 文档的链接吗?它应该说如何进行分页。
  • 它可能在有效载荷中。
  • @Barman 这是链接drive.google.com/open?id=15qwCNqWuW1Etl_z4ML4i0Y6Bga5UH2rB 是西班牙语的PDF,如果您需要翻译请问我。它说分页是通过在 url 末尾写“?offset = [number]”来完成的。所以我必须找到一种方法在代码中实现它,使其每 100 个结果自动分页,然后将它们全部打印在谷歌表中。或者按 100 x 100 打印,直到完成所有结果。
  • 我不会说西班牙语。 :(
  • 查看标题为 Paginación 的部分

标签: javascript api while-loop pagination offset


【解决方案1】:

您将 URL 作为参数传递给 callAPI(),但该函数不使用该参数。

function callAPI(url) {
  //Access Data
 var token = Utilities.base64Encode('mytoken');

  var auth =  {
    user_id: 'myid',
    token: token,}    

  var options = {
    muteHttpExceptions: true,
    method: 'POST',
    payload: JSON.stringify(auth),
    }

  // Call API
  var response = UrlFetchApp.fetch(url, options);

  //Parse response
  var json= response.getContentText();
  return JSON.parse(json)
}  

您没有更新 offset 变量。 offset 总是 0,所以 offset + 100 总是 100。而且您没有使用callAPI() 返回的值。循环需要在您将所有内容推入 output 数组之前进行,或者您可以在 while 循环中执行此操作。

function displayData(){

  var output = []
  var offset = 0

  while (true) {
    var results = callAPI(APIUrl + offset).resultado;
    results.forEach(obj => output.push([obj.code_alfa, obj.detalle, obj.precio]);
    if (result.length < 100) {
      break;
    }
    offset += 100;
  }


  //Clear previous content
  var ss = SpreadsheetApp.openByUrl('mygooglesheeturl').getSheetByName('sheetname');
  ss.getRange(1,1,500,3).clearContent();

  //Insert new data in sheet
  var len = output.length;
  ss.getRange(1,1,len,3).setValues(output);
  Logger.log(output);


}

【讨论】:

  • 非常感谢!现在我的行​​有错误:results.forEach(({code_alfa, detalle, precio}) =&gt; output.push([code_alfa, detalle, precio]); 它说 ":" 在属性 ID 之后丢失。所以我尝试了我之前用于该部分的代码。但随后抛出 TypeError can't find forEach function in the object [object Object]
  • 这是 ES6 对象的简写。如果语法不支持,你可以使用 Babel 进行转译。
  • 我忘记访问resultado 属性来获取结果列表。
  • 非常感谢!我将发布所有更正正常的代码
【解决方案2】:

感谢@Barman,这是工作代码:

    var url = 'http://YOUR_URL?offset=';

function callAPI(url) {
  //Access Data
 var token = Utilities.base64Encode('YOUR_TOKEN');

  var auth =  {
    user_id: 'YOUR_USER_ID',
    token: token,}    

  var options = {
    muteHttpExceptions: true,
    method: 'POST',
    payload: JSON.stringify(auth),
    }

  // Call API
  var response = UrlFetchApp.fetch(url, options);

  //Parse response
  var json= response.getContentText();
  return JSON.parse(json);

}  


function displayData(){

  var output = []
  var offset = 0

  while (true) {
    var results = callAPI(url + offset).resultado;

    results.forEach(function (obj) {
    return output.push([obj.cod_alfa, obj.partnumber, obj.detalle, obj.precio, obj.iva, obj.marca, obj.rubro, obj.subrubro, obj.cotizacion, obj.stock, obj.peso, obj.link]);
    }); //REPLACE obj.YOUR_DATA

    if (results.length < 100) {
      break;
    }
    offset += 100;
  }



  //Clear previous content
  var ss = SpreadsheetApp.openByUrl('YOUR_GOOGLE_SPREADSHEET_URL').getSheetByName('YOUR_SHEET_NAME');
  ss.getRange(4,1,2000,12).clearContent();

  //Insert new data in sheet
  var len = output.length;
  ss.getRange(4,1,len,12).setValues(output);
  Logger.log(output);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    相关资源
    最近更新 更多