Javascript Google应用程序脚本中的API Post请求不工作
我设法通过Postman完成了API POST请求,但一旦为Google应用程序脚本进行了修改,它就不起作用了。我认为这可能与正文格式有关,我无法在GAS中复制新的URLSearchParams对象,我相信我正在发送一个JSON 谢谢 邮递员工作-JavaScript获取Javascript Google应用程序脚本中的API Post请求不工作,javascript,google-apps-script,postman,Javascript,Google Apps Script,Postman,我设法通过Postman完成了API POST请求,但一旦为Google应用程序脚本进行了修改,它就不起作用了。我认为这可能与正文格式有关,我无法在GAS中复制新的URLSearchParams对象,我相信我正在发送一个JSON 谢谢 邮递员工作-JavaScript获取 var myHeaders = new Headers(); myHeaders.append("Content-Type", "application/x-www-form-urlencoded
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));
卷曲
我的错误气体版本:
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;
};
问题:
身体是。您应该使用有效负载
重定向不是选项参数中的有效键
当前,应用程序脚本中不支持
解决方案:
将车身更换为有效载荷
将有效负载对象重新创建为查询字符串。例如,有效负载:{x:1,y:2}应该更改为x=1&y=2
片段:
要查询参数的有效负载对象:
函数objectToQueryParamsobj{
回来
Object.entriesobj
.map[k,v]=>`${encodeURIComponentk}=${encodeURIComponentv}`
.加入“&”
;
}
const myPayload={client_id:XXXX,
客户机密:XXXX,
授予\类型:客户端\凭据};
console.logobjectToQueryParamsmyPayload;问题:
身体是。您应该使用有效负载
重定向不是选项参数中的有效键
当前,应用程序脚本中不支持
解决方案:
将车身更换为有效载荷
将有效负载对象重新创建为查询字符串。例如,有效负载:{x:1,y:2}应该更改为x=1&y=2
片段:
要查询参数的有效负载对象:
函数objectToQueryParamsobj{
回来
Object.entriesobj
.map[k,v]=>`${encodeURIComponentk}=${encodeURIComponentv}`
.加入“&”
;
}
const myPayload={client_id:XXXX,
客户机密:XXXX,
授予\类型:客户端\凭据};
console.logobjectToQueryParamsmyPayload 回答:只要把车身换成有效载荷就足够了
函数objectToQueryParamsobj{
回来
Object.entriesobj
.map[k,v]=>`${encodeURIComponentk}=${encodeURIComponentv}`
.加入“&”
;
}
const myPayload={client_id:XXXX,
客户机密:XXXX,
授予\类型:客户端\凭据};
console.logobjectToQueryParamsmyPayload 回答:只要把车身换成有效载荷就足够了
函数objectToQueryParamsobj{
回来
Object.entriesobj
.map[k,v]=>`${encodeURIComponentk}=${encodeURIComponentv}`
.加入“&”
;
}
const myPayload={client_id:XXXX,
客户机密:XXXX,
授予\类型:客户端\凭据};
console.logobjectToQueryParamsmyPayload;这回答了你的问题吗?如果是这样的话,考虑一下投票结果吧。您的意思是可以使用encodeURIComponent在GAS中复制URLSearchParams对象?这是否回答了您的问题?如果是这样的话,考虑一下投票结果吧。您的意思是可以使用encodeURIComponent在GAS中复制URLSearchParams对象?在OP的情况下,值以表单形式发送。因此,我认为在您的脚本中,payload:objectToQueryParamsmyPayload可以修改为payload:myPayload。在UrlFetchApp上,当使用JSON对象进行有效负载时,该值似乎以表单的形式发送。@Tanaike,顺便说一句,是的,确实声明可以省略字符串化部分。在aaid中,我发现从对象创建查询字符串的实用程序非常有用useful@Oleg瓦尔特:谢谢你的评论。从您的评论中,我可以注意到UrlFetchApp的示例脚本已经更新。从这种情况下,我可以获得新的信息。非常感谢。@Tanaike-我的荣幸:据我回忆,它一直在那里,但我仍然感到困惑的是,JSON.stringify for JSON有效载荷旁边的这一重要信息不在方法描述中-根据我的经验,我确信在你的情况下,人们跳过了exampleIn OP中的任何内容,这些值将作为表单发送。因此,我认为在您的脚本中,payload:objectToQueryParamsmyPayload可以修改为payload:myPayload。在UrlFetchApp上,当使用JSON对象进行有效负载时,该值似乎以表单的形式发送。@Tanaike,顺便说一句,是的,确实声明可以省略字符串化部分。在aaid中,我发现从对象创建查询字符串的实用程序非常有用useful@Oleg瓦尔特:谢谢你的评论。从您的评论中,我可以注意到UrlFetchApp的示例脚本已经更新。从这种情况下,我可以获得新的信息。非常感谢。@Tanaike-我的荣幸:据我回忆,它一直在那里,但我仍然感到困惑的是,JSON.stringify for JSON payloads旁边的这一重要信息不在方法描述中-根据我的经验,我相信在你的例子中,人们跳过了任何内容我相信你也需要将body更改为payloads我相信你也需要将body更改为payloads
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;
};