微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将 Python 请求转换为 Apps 脚本请求 修改点:修改后的脚本:注意:参考:

如何解决将 Python 请求转换为 Apps 脚本请求 修改点:修改后的脚本:注意:参考:

我正在尝试使用 Apps Script 将 API 请求自动化到 Google 电子表格中,GET 请求在 python 中似乎工作正常,但是当我尝试使用 UrlFetchApp.fetch 方法复制相同的请求时,它会引发 422 错误,显然忽略了标题

这是工作的python代码

url = "https://api.granatum.com.br/v1/relatorios/fluxo_caixa?access_token={}".format(token)
r = requests.get(url = caixa,params= {'data_inicio' : '2018-01-01','data_fim' : '2022-02-01','regime':'caixa'})

但是当我尝试将其复制到 Apps 脚本时,它似乎忽略了这些参数

var link = "https://api.granatum.com.br/v1/relatorios/fluxo_caixa?access_token=my_access_token";

headers = {
'data_inicio': '2020-01-01','data_fim': '2020-06-30','regime': 'caixa',};


var options = {
  "method" : "get","contentType":"application/json",'headers': headers,};
  Logger.log(options);
  var res = UrlFetchApp.fetch(link,options)

它抛出以下错误消息:

Exception: Request Failed for https://api.granatum.com.br returned code 422. Truncated server response: {"errors":{"data_inicio":["é obrigatório"],"data_fim":["é obrigatório"],"regime":["é obrigatório","inválido"]}} (use muteHttpExceptions option to examine full response)

翻译响应,它要求提供上面告知的三个参数,就好像它没有收到一样。

解决方法

我相信你的目标如下。

  • 您想将以下 python 脚本转换为 Google Apps 脚本。

      url = "https://api.granatum.com.br/v1/relatorios/fluxo_caixa?access_token={}".format(token)
      r = requests.get(url = caixa,params= {'data_inicio' : '2018-01-01','data_fim' : '2022-02-01','regime':'caixa'})
    
    • 在这个脚本中,url"https://api.granatum.com.br/v1/relatorios/fluxo_caixa?access_token={}".format(token)。但是 requests 使用 url = caixa。但是,根据您的 Google Apps 脚本,在此答案中,它假设您使用的是 url

当你想在上面的脚本中使用url时,下面的修改如何?

修改点:

  • 当我看到你的 python 脚本时,似乎 params 的值是作为查询参数发送的。但在您的脚本中,这些值是在请求标头中发送的。
  • 而且,对于 GET 方法,不需要使用内容类型。

当以上几点反映到 Google Apps Script 时,它会变成如下。

修改后的脚本:

function myFunction() {
  // This is from https://gist.github.com/tanaikech/70503e0ea6998083fcb05c6d2a857107
  String.prototype.addQuery = function(obj) {
    return this + Object.keys(obj).reduce(function(p,e,i) {
      return p + (i == 0 ? "?" : "&") +
        (Array.isArray(obj[e]) ? obj[e].reduce(function(str,f,j) {
          return str + e + "=" + encodeURIComponent(f) + (j != obj[e].length - 1 ? "&" : "")
        },"") : e + "=" + encodeURIComponent(obj[e]));
    },"");
  }

  var url = "https://api.granatum.com.br/v1/relatorios/fluxo_caixa";
  var query = {
    'data_inicio': '2020-01-01','data_fim': '2020-06-30','regime': 'caixa','access_token': 'my_access_token'
  };
  var res = UrlFetchApp.fetch(url.addQuery(query));
  Logger.log(res.getContentText());
}

注意:

  • 在这个答案中,它假设您的 Python 脚本与 url 一起工作正常。并且,它假设您的访问令牌可以使用。请注意这一点。

参考:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。