Google Apps 脚本 UrlFetchApp GET 到 node.js 端点导致空 body

Google Apps Script UrlFetchApp GET to a node.js endpoint results in an empty body

我正在使用 Google Apps 脚本对 node.js API 端点进行 UrlFetchApp 调用。我拥有 Google Apps 脚本代码和 node.js 代码和端点,所以我可以观察发生了什么。

当我使用 Postman 时,它有效。但是当我使用 GAS UrlFetchApp 时,它不起作用,因为节点中的 req.body 是空的 { }。我什至查看了 Postman 为 JavaScript Fetch 创建的代码,并尝试几乎复制它,除了我知道 GAS 的 UrlFetchApp 需要的东西。我已经使用 GAS 对各种外部端点进行了多次 UrlFetchApp 调用。所以,我不是新手,但搞不懂这个。

这是我的 Google Apps 脚本代码:

    var url = 'https://xxxxxxxxxxx.azurewebsites.net/api/account';

    var data = {
      "email": address,
      "apiKey": 'xxxxxxxxxxxxxxxxxxx'
    }

    var payLoadInfo = JSON.stringify(data);

    var options = {
      "method": "GET",
      "headers": {'Content-Type': 'application/json'},
      // 'Content-Type': 'application/json',
      // "contentType": 'application/json',
      redirect: 'follow',
      "muteHttpExceptions": true,
      "body": payLoadInfo,
      // "payload": JSON.stringify(data)
      // payload: payLoadInfo
    };

    var response = UrlFetchApp.fetch(url, options);

“选项”中被注释掉的部分是我尝试使用的几种不同方式。我知道过去我通常使用“payload”而不是像这次这样的“body”(邮递员建议的)。当我使用“payload”时,它完全失败,甚至没有到达我的节点代码。我还尝试将 apiKey 放在 header.

这里是 node.js API 端点代码:

  router.get("/account", async (req, res) => {

  var apiKey = process.env.API_KEY;

  console.log('apiKey = ' + apiKey);
  console.log('req.body = ' + JSON.stringify(req.body, null, 2));
  console.log('req.body.apiKey = ' + req.body.apiKey);

  if (req.body.apiKey != apiKey) {

    console.log('apiKey is not equal');
    res.status(401).send({ error: "You are not authorized." });

  } else {

    process the request...

  }

当我在“选项”中使用“有效载荷”时,我得到一个 500,并且服务器代码从不执行。 当我在“选项”中使用“body”时,我看到服务器代码执行,但是 console.log('req.body = ' + JSON.stringify(req.body, null, 2)), 只是返回一个空的 object {},然后由于 req.body.apiKey != apiKey,它控制“apiKey 不相等”并发送 401。使用 Postman 时, req.body object 控制台正常,显示电子邮件和 apiKey。

无论我将什么组合放入选项中,它都会以 500 或 401 失败。但是,Postman 使用几乎相同的参数 headers 等

这是 Postman 显示的代码:

var myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");
myHeaders.append("Cookie", "ARRAffinity=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; ARRAffinitySameSite=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");

var raw = JSON.stringify({"email":"xxxxxxxxxxxxxxxxx@gmail.com","apiKey":"xxxxxxxxxxxxxxxx"});

var requestOptions = {
  method: 'GET',
  headers: myHeaders,
  body: raw,
  redirect: 'follow'
};

我什至尝试包括 cookie 和“重定向:跟随”,但 none 有效。

我错过了什么?

感谢@Tanaike 的帮助,我让它工作了(见上面的评论)。

似乎与 node.js 中的正常“获取”不同,Google 中的 URLFetchApp Apps 脚本不会发送 body 和 GET。

我仍然使用 GET,但改为在 URL 中发送参数,在 header 中发送 apiKey。