はじめに
ServiceNowは外部のWeb Serviceと連携することができます。
今回は、フリーのWeb Serviceと連携して、Locationの緯度・経度を取得する方法を取り上げます。
外部Web Serviceの紹介
東京大学空間情報科学研究センターは、「シンプル ジオコーディング 実験」として、住所をURLの引数に取って、その緯度・経度情報をXMLでResponseするサービスを公開しています。
上記のWeb Serviceの利用にあたっては、参加規約に従ってください。
REST Messageの設定
All > System Web Servies > REST Messageから、次のように新規Rest Messageを作成します。
- Name: Get Lati and Longi
- Endpoint: http://geocode.csis.u-tokyo.ac.jp/cgi-bin/simple_geocode.cgi?charset=UTF8&addr=${address}
- その他: (Defaultのまま)
関連リストHTTP Methodsから、次のように新規HTTP Methodをを作成します。
- Name: Default GET
- HTTP Method: Get
- Endpoint: http://geocode.csis.u-tokyo.ac.jp/cgi-bin/simple_geocode.cgi?charset=UTF8&addr=${address}
テストのために関連リストから、新規Variable Substitutionを作成します。
- Name: address
- Value: %E6%9F%8F%E5%B8%82%E6%9F%8F%E3%81%AE%E8%91%89%EF%BC%95%EF%BC%8D%EF%BC%91%EF%BC%8D%EF%BC%95
ここで、一回Testします。関連リンクからTestをクリックします。無事、結果がXMLで返ってきたことが確認できます。
LocationテーブルのBusiness Ruleの設定
作成したRest MessageをLocationテーブルのBusiness Ruleから呼び出し、Locationレコードに緯度・経度をセットします。
cmn_location.listでList Viewを開き、3本線アイコンからConfigure > Business Ruleを開き、次のように新規ビジネスルールを作成します。Locationテーブルには、テストのために、事前にu_lati_longi_xmlフィールドを追加して、REST Messageか返す生XMLを確認するフィールドを作成しておきます。
(function executeRule(current, previous /*null when async*/) {
// Add your code here
// Set varialbles of the addredd of the location
var locAddr = current.state +current.city + current.street;
var encLocAddr = encodeURI(locAddr);
gs.info('BR [Get Lati and Longi]:' + locAddr + ':' + encLocAddr);
try {
//Execute the predefined REST.
var r = new sn_ws.RESTMessageV2('Get Lati and Longi', 'Default GET');
r.setStringParameterNoEscape('address', encLocAddr);
var response = r.execute();
var responseBody = response.getBody();
var httpStatus = response.getStatusCode();
// Set the result of the response for testing.
current.u_lati_longi_xml = responseBody;
// Parse XML and Set the latitude and the longitude to the fields.
var xmlDoc = new XMLDocument2;
xmlDoc.parseXML(responseBody);
var lati = xmlDoc.getFirstNode('/results/candidate/latitude');
var longi = xmlDoc.getFirstNode('/results/candidate/longitude');
current.latitude = lati.getTextContent();
current.longitude = longi.getTextContent();
}
catch(ex) {
var message = ex.message;
gs.error('BR [Get Lati and Longi]:' + message);
//If an error occured, set the latitude and longitude of Tokyo Chuo-ku Nihonbashi 1-1-1
current.latitude = '35.683861';
current.longitude = '139.773697';
}
})(current, previous);
Locationレコードの作成とテスト
Locationレコードを作成して、Rest MassageとBusiness Ruleをテストします。
適当なNameを付けて、実在する住所をState / Province、City、Streetに入力してからSavaします。
すると、次の例のように、Latitude(緯度)とLongtitude(経度)が正常に自動セットされました。