我试图调用我的ServiceNow JSON Web服务。我执行URLFetchApp时遇到意外错误。我猜测我是以错误的方式传递授权标题但是GAS和ServiceNow文档都非常糟糕。我已经看到了其他类似的问题,但没有一个有效。任何帮助将不胜感激。
function getOpenTickets(){
var headers = {
"Authorization":"Basic RgRJ5U6EsxHt00229KX5Hj0WV1z18q08==",
"Content-Type":"application/json",
"Username":"myusername",
"Password":"mypassword"
}
var url = "https://mysninstance.service-now.com/u_equipment_repair.do?JSONv2=&sysparm_view=vendor&displayvalue=true&sysparm_action=getRecords&sysparm_query=state=500^assignment_group.name=MyGroup^ORDERBYDESCnumber";
var url = encodeURIComponent(url);
var options = {
"method":"get",
"headers":headers
}
var result = UrlFetchApp.fetch(url,options);
Logger.log(result.getContentText());
}
答案 0 :(得分:2)
好的,所以我找到了解决方案。实际上有两个问题。
第一个是我传递授权标头的方式。我将基本身份验证作为已编码的base64字符串传递,在此基础上我仍然传递了多余的用户名和密码。无论出于何种原因,Google Apps脚本(GAS)都不喜欢这样。一旦我更改了标题和选项,如下所示就可以了。
第二个问题是URI编码。由于插入符号“^”符号,查询字符串确实需要编码,但无论出于何种原因,GAS的encodeURIComponent都没有正确编码。只要我用他们的URL编码的等价物(“%5E”)手动替换插入符号,一切正常,我就能通过Google Apps脚本检索我的ServiceNow数据。
function getOpenTickets3(){
var headers =
{
Authorization : "Basic " + Utilities.base64Encode('myusername:mypassword'),
"Content-Type":"application/json"
}
var options =
{
"method" : "get",
"headers": headers
};
var url = "https://mysninstance.service-now.com/u_equipment_repair.do?JSONv2=&sysparm_view=vendor&displayvalue=true&sysparm_action=getRecords&sysparm_query=state=500%5Eassignment_group.name=Somevendor%5EORDERBYDESCnumber";
var result = UrlFetchApp.fetch(url,options);
Logger.log(result.getContentText());
}
答案 1 :(得分:0)
您在此行中编码整个网址的URI:
var url = encodeURIComponent(url);
在您的网址中,传递给fetch(...)
时,基本路径需要取消转义:
https://mysninstance.service-now.com/u_equipment_repair.do
?
后面的每个参数都是一个URI组件,如:
sysparm_view=vendor
在这种情况下,参数名称为sysparm_view
,值为vendor
,如果值包含vendor
之类的特殊字符,则需要对值进行URI编码(/?&
) {1}}。
在您提供的静态URL中,实际上没有任何需要编码的内容,因此删除对encodeURIComponent(url)
的调用应该有效。
如果您正在处理URL参数的动态值,那么在连接到主字符串之前,您需要分别对每个参数值进行URI编码。