簡體   English   中英

從另一個Google WebApp的Google WebApp獲取JSON對象

[英]Fetch JSON object from Google WebApp from another Google WebApp

我有兩個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)時,記錄器會顯示一個長的HTML文件,其中填充了元數據(當我在瀏覽器中查看該文件時,沒有可見的內容)。 我對為什么會這樣感到困惑...我知道有幾個重定向返回JSON,但是據我了解, UrlFetchApp.fetch()方法默認遵循所有重定向。

這可能是OAuth問題嗎? 腳本A已發布為以用戶訪問應用程序的身份運行,盡管我也嘗試過以我的身份運行它。

思考?

當您將腳本部署為網絡應用程序以作為服務運行時,您只能使用.exec url並使用urlFetch進行調用,因為開發url(以.dev結尾的那個)只能由您訪問,並且請求並非來自您,但來自Google。

我部署了您的示例,並使用您的代碼對其進行了測試,如下所示:

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

結果是預期的:

在此處輸入圖片說明

您可以自行測試它,因為該應用程序以“像我一樣運行”的方式部署,並且任何人都可以訪問,甚至可以匿名訪問。

如果要限制其訪問,則必須在URL中添加一些參數,並在服務器Web應用程序中處理這些參數以檢查請求的來源。

像這樣簡單地將參數添加到url中:

 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:部署參數:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM