[ServiceNow] [基礎] 外部Web ServiceをREST Messageで利用する

# はじめに

ServiceNowは外部のWeb Serviceと連携することができます。
今回は、フリーのWeb Serviceと連携して、Locationの緯度・経度を取得する方法を取り上げます。

# 外部Web Serviceの紹介

東京大学空間情報科学研究センターは、「シンプル ジオコーディング 実験」として、住所をURLの引数に取って、その緯度・経度情報をXMLでResponseするサービスを公開しています。

* https://geocode.csis.u-tokyo.ac.jp/
* https://geocode.csis.u-tokyo.ac.jp/home/simple-geocoding/

:::note alert
上記のWeb Serviceの利用にあたっては、参加規約に従ってください。

* https://geocode.csis.u-tokyo.ac.jp/home/simple-geocoding/simple-geocoding-tems-of-use/
:::

# 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のまま)
![GetLatiAndLongi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490802/7a85cb6e-26c3-351a-1944-dadc62e73f02.png)

関連リスト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

![GetLatiAndLongiMethod.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490802/69e8d5f6-56a2-0b68-60ae-6089f59ef6f7.png)

ここで、一回Testします。関連リンクからTestをクリックします。無事、結果がXMLで返ってきたことが確認できます。

![GetLatiAndLongiMethodTest.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490802/e292f04a-401d-ec9e-5694-58cd7838c383.png)

# 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を確認するフィールドを作成しておきます。

![LocationBRWhenToRun.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490802/dfdda936-c0c8-06cb-cbe1-3f3b01c63ce8.png)
![LocationBRScript.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490802/f4ad1024-bfd5-ad7d-d892-3e9def770846.png)

```Javascript:Script
(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（経度）が正常に自動セットされました。

![LocationNihonbashi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490802/ec01a31d-c3bf-fdd4-2a28-525e0a4dbf24.png)