如何 POST JSON 到带有 DEV Link 的 Google Apps 脚本

How to POST JSON to a Google Apps Script with DEV Link

我有一个 Google Apps 脚本项目,我需要通过 GET 和 POST 方法接收一些请求。使用 GET 方法一切顺利,因为我可以在浏览器中通过 URL 模拟它;问题出在 POST 方法中,我无法通过 CURL 执行此操作,它显示 Google 权限错误。

这是我的代码

function doPost(e) {

  let response = ContentService.createTextOutput()
  response.setContent(JSON.stringify({
    response: e
  }))
  response.setMimeType(ContentService.MimeType.JSON)

  return response
}

function foo()
{
    var url = "https://script.google.com/macros/s/id/dev";
    var headers = {"Authorization": "Bearer " + ScriptApp.getOAuthToken()};
    var payload = {
      debug: 'data ok'
    }

    var params =
    {
        "method": "post",
        "contentType": "application/json",
        "headers": headers,
        "payload": JSON.stringify(payload),
        "muteHttpExceptions": true
    };
    var response = UrlFetchApp.fetch(url, params).getResponseCode()
    Logger.log(response);
}

我需要使用 https://script.google.com/macros/s/id/**dev** link 进行调试。目的不是每次测试都生成一个版本。

current state 中,Test Deployments 仅供对脚本具有编辑权限的用户访问。这意味着您需要登录才能访问此部署,并且您不能通过 cURL 请求来执行此操作,除非您有必要的 cookie 来执行此操作。

解决方法如下:

  1. 打开Google Developer Tools > Network Tab
  2. 转到您拥有测试部署的页面,/dev/ 端点。
  3. 在名为 dev 的请求中,单击第二个按钮并转到 Copy > Copy as cURL。这将使用所有必要的 cookie 复制请求。
  4. 在终端中,通过添加 -X POST 来发出请求。

响应包含所需页面的 HTML。

文档

我相信你的目标如下。

  • 您想使用 curl 命令通过 https://script.google.com/macros/s/###/dev 请求您的 Web 应用程序。

在这种情况下,下面的 curl 命令怎么样?

curl 命令示例:

当你的payload被使用时,变成如下

curl -L \
  -d '{"debug": "data ok"}' \
  -H "Authorization: Bearer ###your access token###" \
  -H "Content-Type: application/json" \
"https://script.google.com/macros/s/###/dev"
  • 为了访问https://script.google.com/macros/s/###/dev,需要在请求头中包含访问令牌。并且作为一个范围,它需要用于 Drive API。例如,它是 https://www.googleapis.com/auth/drive.readonly.

  • 如果您想对此进行测试,可以使用以下 Google Apps 脚本示例脚本检索访问令牌。您可以将此访问令牌与上述 curl 命令一起使用。

      function getAccesstoken() {
        console.log(ScriptApp.getOAuthToken())
        // DriveApp.getFiles(); // This is used for automatically detecting the scope of `https://www.googleapis.com/auth/drive.readonly`.
      }
    
  • 这样的话,doPost(e)e如下

      {"contextPath":"","parameter":{},"postData":{"contents":"{\"debug\": \"data ok\"}","length":20,"name":"postData","type":"application/json"},"contentLength":20,"queryString":"","parameters":{}}
    

参考: