UrlFetchApp上出现意外错误

时间:2014-05-30 17:05:39

标签: google-apps-script servicenow

我试图调用我的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());
}

2 个答案:

答案 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编码。