javascript - Google App Script中的API Post请求不起作用
问题描述
我设法通过 Postman 完成 API POST 请求,但是一旦针对 Google App Script 进行了修改,它就不起作用了。我认为这可能与body
格式有关,我无法new URLSearchParams()
在 GAS 中复制对象(我相信我正在发送 JSON)。
谢谢。
邮递员(工作) - JavaScript Fetch
var myHeaders = new Headers();
myHeaders.append("Content-Type", "application/x-www-form-urlencoded");
var urlencoded = new URLSearchParams();
urlencoded.append("client_id", "XXXX");
urlencoded.append("client_secret", "XXXX");
urlencoded.append("grant_type", "client_credentials");
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: urlencoded,
redirect: 'follow'
};
fetch("https://apigateway.criteo.com/oauth2/token", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
卷曲
curl --location --request POST 'https://apigateway.criteo.com/oauth2/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'client_id=XXXX' \
--data-urlencode 'client_secret=XXXX' \
--data-urlencode 'grant_type=client_credentials'
我的错误 GAS 版本 :(
function getCostAU() {
var myHeaders = {"Accept": "application/json",
"Content-Type": "application/x-www-form-urlencoded"};
var myPayload = {"client_id" : "XXXX",
"client_secret" : "XXXX",
"grant_type" : "client_credentials"};
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: myPayload,
redirect: 'follow',
};
var url = "https://apigateway.criteo.com/oauth2/token";
var result = JSON.parse(UrlFetchApp.fetch(url, requestOptions).getContentText());
var access_token = result.access_token;
};
解决方案
问题:
body
不是参数中的有效键options
。你应该payload
改用。redirect
不是options
参数中的有效键目前,
URLSearchParams
在应用程序脚本中不受支持。
解决方案:
更改
body
为payload
将对象重新创建
payload
为查询字符串。例如,payload:{x:1,y:2}
应更改为x=1&y=2
.
片段:
- 有效载荷对象查询参数:
function objectToQueryParams(obj) {
return (
Object.entries(obj)
.map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)
.join('&')
);
}
const myPayload = {"client_id" : "XXXX",
"client_secret" : "XXXX",
"grant_type" : "client_credentials"};
console.log(objectToQueryParams(myPayload));
- 有效
requestOption
:
const requestOptions = {
/**@see https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app#fetch(String,Object)*/
method: 'POST',
headers: myHeaders,
payload: objectToQueryParams(myPayload),//modified
//or just payload: myPayload will work as mentioned in the comments below
//redirect: 'follow',//removed
followRedirects: true
};
- 完整脚本:
/**Mock UrlFetchApp library*/
const UrlFetchApp = {
fetch: () => ({
getContentText: () =>
'{"access_token":"jghlfdjlfwqwXjogsfshbkgetrwuguerjyrcyfxuux=="}',
}),
};
getCostAU(); //call function
//Mock end
function getCostAU() {
const myHeaders = {
Accept: 'application/json',
'Content-Type': 'application/x-www-form-urlencoded',
};
const myPayload = {
client_id: 'XXXX',
client_secret: 'XXXX',
grant_type: 'client_credentials',
};
function objectToQueryParams(obj) {
return Object.entries(obj)
.map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)
.join('&');
}
const requestOptions = {
/**@see https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app#fetch(String,Object)*/
method: 'POST',
headers: myHeaders,
payload: objectToQueryParams(myPayload), //modified
//or just payload: myPayload will work as mentioned in the comments below
//redirect: 'follow',//removed
followRedirects: true,
};
const url = 'https://apigateway.criteo.com/oauth2/token';
const result = JSON.parse(
UrlFetchApp.fetch(url, requestOptions).getContentText()
);
const access_token = result.access_token;
console.log(access_token);
}
推荐阅读
- powerbi - 切片机被过滤了
- python - 从单独的脚本加载 .pyc 文件时面临问题
- python-3.x - FastAPI 屏蔽字段
- r - 在没有pivot_longer的dplyr中按R中的列分组计算rowMeans
- android - 使用 React native 从 Android Emulator 连接到 Scala Websocket
- reactjs - Next.js API 路由是否缓存查询结果?
- python - reCAPTCHA Selenium 和 Buster 交互
- apache-kafka - 如何查找两个对象是否已接近一段时间
- python - 如何在列表中查找重复值并修改它们?
- javascript - Reactjs:setstate 渲染顺序问题