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。
我正在使用 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。