如何使用基本授权按钮分配UrlFetchApp?

问题描述 投票:1回答:1

我在谷歌Apps脚本,当我在谷歌Apps脚本运行它工作得很好创建功能。输出数据返回到谷歌表。

function testFunction11() {
  var rng = SpreadsheetApp.getActiveRange();
  var encodedAuthInformation = Utilities.base64Encode("username:key");
  var headers = {"Authorization" : "Basic " + encodedAuthInformation};
  var params = {
    'method': 'GET',
    'muteHttpExceptions': true,
    'headers': headers
  };
  var res = UrlFetchApp.fetch("https://api.apiservice.com/api/v1/xxx?fields=somefields", params);
  Logger.log(res.getContentText());
  rng.setValue(res);
}

输出单元:

[
  {
    "id": xxx,
    "createdDate": "2019-02-01T04:54:00Z",
    "reference": "XXX"
  },
etc

然后我给你的脚本按钮,“testFunction11”。当我点击按钮,返回

{
  "message": "An error has occurred."
}

它看起来像从API服务器响应。

我唯一的假设是,谷歌片的按钮增加了一些头,用户代理或内容类型的要求,这在API服务器不允许的。而一些搜索后,我想我不能要求重新分配的User-Agent。那是正确的事情还是我错了?

编辑1:

每个案例console.log(UrlFetchApp.getRequest(url, params))头:在电子表格中点击按钮:

{headers={Authorization=Basic XXXXXXXXQVU6MWVhODlmZmFkN2U3NGNjOGJkOTc1YTE1ZjVhNTE3MzE=, X-Forwarded-For=178.xx.my.ip}, method=get, payload=, followRedirects=true, validateHttpsCertificates=true, useIntranet=false, contentType=null, url=https://api.apisite.com/api/v1/SalesOrders?fields=Id,Createddate,Reference&where=Createddate%3E2019-02-01T00:00:00Z}

而对于脚本:

{headers={Authorization=Basic XXXXXXXXQVU6MWVhODlmZmFkN2U3NGNjOGJkOTc1YTE1ZjVhNTE3MzE=}, method=get, payload=, followRedirects=true, validateHttpsCertificates=true, useIntranet=false, contentType=null, url=https://api.apisite.com/api/v1/SalesOrders?fields=Id,Createddate,Reference&where=Createddate%3E2019-02-01T00:00:00Z}

所以按钮只会增加X-Forwarded-For

当我试图手动添加X-Forwarded-For: 'unknown'有这样的错误

There are attribute with impossible value: Header:X-Forwarded-For

在俄罗斯的错误的文字,对可能不准确的翻译很抱歉。这很有趣,因为当我在同样的方式加入Test: unknown,没有错误,但显然没有工作。看起来谷歌不允许更改此值。

将尝试在邮递员不同的页眉和可能确认这头是错误的原因。谢谢@TheMaster

编辑2:

我通过邮差尝试了不同的标题。所以,结果是,当我加入到X-Forwarded-For键与任何价值,它返回"message": "An error has occurred."当我不添加此键头,效果很好。

所以,问题是任何方法来禁用添加通过谷歌Apps脚本这个头。好像没有。

google-apps-script get basic-authentication urlfetch
1个回答
1
投票
  • 在你的情况,当UrlFetchApp.fetch()从电子表格上的按钮运行,X-Forwarded-For被自动添加到头部。
  • 通过加入X-Forwarded-For到头部时,发生An error has occurred.的错误。
  • 在另一方面,X-Forwarded-For未在报头中使用,不会发生错误。

如果我的理解是正确的,这个怎么样的解决方法?我想可能有几种解决方法。所以,请认为这是他们的只有一个。在此解决方案,Web应用程序被用作包装函数。

Sample script:

首先,请复制并粘贴下面的脚本。并请设置testFunction11()到按钮。当运行testFunction11()testFunction11()请求Web应用程序(doGet())和Web应用程序请求https://api.apiservice.com/api/v1/xxx?fields=somefields。由此,X-Forwarded-For不是用来请求的报头中。然后,Web应用程序的结果返回,并把价值的电子表格。请部署Web应用程序,在运行脚本之前。

function testFunction11() {
  var rng = SpreadsheetApp.getActiveRange();
  var url = ScriptApp.getService().getUrl();
  var params = {method: "get", headers: {Authorization: "Bearer " + ScriptApp.getOAuthToken()}};
  var res = UrlFetchApp.fetch(url, params);
  Logger.log(res.getContentText());
  rng.setValue(res);
}

function doGet() {
  var url = "https://api.apiservice.com/api/v1/xxx?fields=somefields";
  var encodedAuthInformation = Utilities.base64Encode("username:key");
  var headers = {"Authorization" : "Basic " + encodedAuthInformation};
  var params = {
    'method': 'GET',
    'muteHttpExceptions': true,
    'headers': headers
  };
  var res = UrlFetchApp.fetch(url, params);
  return ContentService.createTextOutput(res.getContentText());
}

Deploy Web Apps:

在运行此脚本,请部署Web应用程序。

  • 在脚本编辑器
  • 发布 - >部署为Web应用程序 创建新的项目版本 在“执行应用程序一个” S,选择“我” 在“谁可以访问应用程序”, 如果函数使用的只有你,选择“只有我自己”。 如果函数被多家用户,请选择“任何人”。 点击“部署” 复制“当前的Web应用程序的URL” 点击“确定”

Note:

  • 当你修改了剧本,请重新部署Web应用程序的新版本。通过这种方式,最新的脚本反映到Web应用程序。这是一个很重要的一点。
  • 这是一个简单的示例脚本。所以,请修改您的情况。

References:

© www.soinside.com 2019 - 2024. All rights reserved.