问题描述
我在使用 UrlFetchApp 在 Google Scripts 上执行简单的 POST 请求时遇到了一些问题。
此代码在带有 node-fetch 库的 NodeJS 上运行良好。
const fetch = require('node-fetch');
const URL = "https://login.XXXXXXXXXXXXX.com.br/api/login"
fetch(URL,{
"body": "{'my_json_data': 'login data'}","method": "POST",}).then(res => res.text())
.then(body => console.log(JSON.parse(body)));
对使用 UrlFetchApp 的 Google Scripts 项目的相同请求给了我 403 Forbidden HTTP 错误。
var url = 'https://login.XXXXXXXXX.com.br/api/login';
var data = {
'email':'EMAIL','password':'PASS'
}
var options = {
method: 'POST',payload: JSON.stringify(data)
}
var response = UrlFetchApp.fetch(url,options);
Logger.log(response)
我在这里遗漏了什么?
编辑:已经尝试使用有效载荷。
解决方法
我相信你的目标如下。
-
您想将以下 Node.js 脚本转换为 Google Apps 脚本。
const fetch = require('node-fetch'); const URL = "https://login.XXXXXXXXXXXXX.com.br/api/login" fetch(URL,{ "body": "{'my_json_data': 'login data'}","method": "POST",}).then(res => res.text()) .then(body => console.log(JSON.parse(body)));
修改点:
- 在您的 Node.js 脚本中,
"{'my_json_data': 'login data'}"
的数据作为data
发送到text/plain
。所以在这种情况下,在使用 UrlFetchApp 时,需要设置内容类型。因为当未设置内容类型时,数据将作为form-data
发送。
当以上几点反映到你的脚本中时,它变成如下。
修改后的脚本:
从:var options = {
method: 'POST',payload: JSON.stringify(data)
}
到:
var options = {
method: 'POST',payload: JSON.stringify(data),contentType: "text/plain"
}
- 如果
contentType: "text/plain"
发生错误,请将其修改为contentType: "text/plain;charset=UTF-8"
。 - 虽然我不确定您的 API 的规范,但我认为
contentType: "application/json"
也可以使用。但这是我的猜测。