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

わかりましたので、解決策を見つけました。実際には2つの問題がありました。

1 つ目は、認証ヘッダーを渡す方法に関するものでした。基本認証を既にエンコードされたbase64文字列として渡していましたが、その上に冗長なユーザー名とパスワードを渡していました。なんらかの理由で、Google Apps Script (GAS) はこれを好まない。以下に示すようにヘッダーとオプションを変更すると、問題ありませんでした。

2 つ目の問題は、URI エンコーディングです。キャレット「^」記号のためにクエリ文字列をエンコードする必要がありましたが、何らかの理由で GAS の encodeURIComponent が適切にエンコードしていませんでした。キャレット記号を手動で URL エンコードされた同等の "%5E" に置き換えるとすぐに、すべてが正常に機能し、Google Apps Script を介して 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で、値はです。のような特殊文字が含まれている場合vendorは、値 ( ) を URI エンコードする必要があります。提供する静的 URL には、実際にはエンコードする必要があるものは何もないため、その呼び出しを削除すると機能するはずです。vendor/?&encodeURIComponent(url)

URL パラメーターの動的な値を扱っている場合は、メインの文字列に連結する前に、各パラメーター値を個別に URI エンコードする必要があります。

于 2014-05-30T19:39:10.540 に答える