0

我正在尝试调用我的 ServiceNow JSON Web 服务。执行 URLFetchApp 时出现意外错误。我猜我以错误的方式传递了授权标头,但是 GAS 和 ServiceNow 文档都非常糟糕。我已经看到了与此类似的其他一些 SO 问题,但没有一个有效。任何帮助,将不胜感激。

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());
}
4

2 回答 2

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());
}
于 2014-06-03T13:51:53.380 回答
0

您正在对这一行中的整个 URL 进行 URI 编码:

var url = encodeURIComponent(url);

在您的 URL 中,基本路径在传递给时需要不转义fetch(...)

https://mysninstance.service-now.com/u_equipment_repair.do

后面的每个参数?都是一个 URI 组件,例如:

sysparm_view=vendor

在这种情况下,参数名称是sysparm_view,值是vendorvendor如果它包含特殊字符,如/?&. 在您提供的静态 URL 中,实际上没有任何需要编码的内容,因此删除该调用encodeURIComponent(url)应该可以工作。

如果您正在处理 URL 参数的动态值,那么您希望在连接到主字符串之前分别对每个参数值进行 URI 编码。

于 2014-05-30T19:39:10.540 回答