从另一个Google WebApp从Google WebApp获取JSON对象

时间:2014-08-15 17:19:48

标签: javascript json google-apps-script urlfetch

我有两个Google Spreadsheets,每个都附加了一些Apps脚本。最终,我希望将它们都部署为WebApp,以便它们可以通过公共URL相互通信。目前,我只部署了其中一个,所以我可以测试这个功能。

我们将脚本A称为部署为WebApp和脚本B的脚本,即尝试向脚本A的URL发送请求的脚本。这里的目标是脚本A将JSON对象返回到脚本B。

在脚本A中,我有这段代码:

function doGet(request) {
  var data = [[1, 2, 3], [4, 5, 6]]; //dummy JSON object

  return ContentService.createTextOutput(JSON.stringify(data))
    .setMimeType(ContentService.MimeType.JSON);
}

在脚本B中,我有这段代码:

function pullJSON(URL) {  
  var data = UrlFetchApp.fetch(URL, {"contentType": "application/json"});
Logger.log(data);
}

当我访问脚本A的exec URL时,我得到一个JSON对象。但是,当我在脚本B中运行 pullJSON()(为它提供相同的URL)时,Logger会显示一个填充了元数据的长HTML文件(当我在其中查看时,没有可见的内容)我的浏览器)。我很困惑为什么会出现这种情况......我知道有几个重定向要返回JSON,但我理解 UrlFetchApp.fetch()方法默认为遵循所有重定向。

这可能是OAuth问题吗?脚本A发布为用户访问应用程序,但我也尝试以我的身份运行它。

思想?

1 个答案:

答案 0 :(得分:0)

当您将脚本部署为webapp作为服务运行时,您只能使用.exec url通过urlFetch调用它,因为开发URL(以.dev结尾的那个)只能由您访问并且请求确实不是来自你,而是来自谷歌。

我部署了您的示例并使用您的代码对其进行了测试,如下所示:

function pullJSON(URL) {  
  var URL = "https://script.google.com/macros/s/AKfycbzqRgv1XfUUrAimvD31OXx89GdhjeBd45SBODaq1c7bkGVusio/exec"
  var data = UrlFetchApp.fetch(URL, {"contentType": "application/json"});
Logger.log(data);
}

结果如预期:

enter image description here

您可以自行测试,因为应用程序已部署为"以我的身份运行"任何人都可以访问,甚至匿名。

如果您想限制其访问权限,您必须在URL中添加一些参数并在服务器webapp中处理这些参数以检查请求的来源。

只需将参数添加到网址中,如下所示:

 var data = UrlFetchApp.fetch(URL+"?user=serge&secret=secretcode", {"contentType": "application/json"});

然后在你的服务器脚本中检查它:

var user = request.parameter.user;
var secret = request.parameter.secret;

并且您将获得用户和秘密。


编辑:以下是带有安全控件的两个脚本的完整示例:

webapp:

function doGet(e) {
  var data = [[1, 2, 3], [4, 5, 6]]; //dummy JSON object
  if(e.parameter.user=='serge'&&e.parameter.secret=='secretcode'){
    return ContentService.createTextOutput(JSON.stringify(data))
    .setMimeType(ContentService.MimeType.JSON);
  }else{
    return ContentService.createTextOutput('You are not allowed to get this result, user should be '+e.parameter.user+' and code should be '+e.parameter.secret)
    .setMimeType(ContentService.MimeType.TEXT);
  }
}

和测试脚本:

function pullJSONSecure() {  
  var URL = "https://script.google.com/macros/s/AKfycbyzoFbcjTXMCALTOlscwAZP6gY1mWc1mkbWb84LYO-qeQk16xw/exec"
 var data = UrlFetchApp.fetch(URL+"?user=serge&secret=secretcode", {"contentType": "application/json"});
  Logger.log(data);
}

如果您尝试使用此脚本并更改用户名或密码,您将看到会发生什么。


编辑2:部署参数:

enter image description here