【IRIS/Cache】そうだWebアプリケーションを作ろう – RESTサービス作成編(手動版)

本記事は、ObjectScriptでのRESTサービスの構築(手動版)について解説します。

※この記事は下記の方向けになります。
  • Webアプリケーションの構築を行い方
  • RESTサービス構築(手動版)について知りたい方

はじめに

Python、Java、Node.js など、さまざまな言語で REST サービスの構築が行われています。

今や REST サービスは特別なものではなく、システム間連携や外部アプリケーションとのデータ連携を実現するための必須要素となっています。

IRIS/Caché においても例外ではなく、クラス「%CSP.REST」を用いることで、REST 形式の Web サービスを比較的容易に構築することが可能です。

本記事では、ObjectScript を使ってREST サービスをどのように構築するのかについて、実際のコード例を交えながら解説します。

それでは、さっそく REST サービスを作成していきましょう。

RESTサービスの構築(手動版)

作業工程の確認

RESTサービスを手動で作成・設定するには、下記手順を行っていきます。

RESTサービス構築手順
  1. %CSP.REST.clsを継承したクラスを作成する
  2. パラメータ設定
  3. UrlMapを作成する
  4. ウェブ・アプリケーションを設定する
  5. IISを設定する(windows)

では、順に確認していきましょう。

① %CSP.REST.clsを継承したクラスを作成する

先ずはRESTサービスの基本となる、「RESTサービス・クラス」を作成します。

今回はサンプルクラスとして、名称を「developer.rest.Sample」とし、「%CSP.REST」を継承させます。

【サンプルPG】

Class developer.rest.Sample Extends %CSP.REST
{

}

② パラメータ設定

空のクラスが作成出来たら、次はパラメータの設定を行います。

下記は、システムで設定されているパラメータの一部です。

パラメータ名設定値説明
CONTENTTYPEtext/htmlContent-Typeを設定する
HandleCorsRequestnullCORSサポート関連。
CORS処理の決定はURLマップルートの設定に委任される
 null:未設定(default)
 1:CORS処理がオン
 0:CORS処理がオフ
UseSession0CSPセッションの制御を設定する。
 1:CSPセッションを継続する
 0:接続毎に新規CSPセッションを作成する
CHARSETUTF-8ページのデフォルトの文字セットを指定する
CONVERTINPUTSTREAM0%request.Content, %request.MimeDataの値を、元の文字セットから変換する
 0:変換しない。バイナリで取得する
 1:変換する。

パラメータの設定は任意となっています。

今回は、下記「CONTENTTYPE」「HandleCorsRequest」「UseSession」の3パラメータのみ設定します。

【サンプルPG】

Class developer.rest.Sample Extends %CSP.REST
{

Parameter CONTENTTYPE = "application/json";

Parameter HandleCorsRequest = 1;

Parameter UseSession = 0;

}

③ UrlMapを作成する

パラメータの設定が終わったら、次はREST呼び出しの関連付け設定「UrlMap」をXDataで作成します。

<Routes>要素の入れ子として、<Route>要素を設定していきます。
今回は、サンプルなので、下記2つのエンドポイントと呼び出す関数を設定したいと思います。

【サンプルPG】

Class developer.rest.Sample Extends %CSP.REST
{

Parameter CONTENTTYPE = "application/json";

Parameter HandleCorsRequest = 1;

Parameter UseSession = 0;

XData UrlMap
{
<Routes>
	<Route Url="/sample" Method="GET" Call="test" Cors="true"/>
	<Route Url="/sample2/:id" Method="GET" Call="test" Cors="true"/>
   </Routes>
}

ClassMethod test(id As %Integer = "") As %Status
{
	s ret = {
		"SessionId": (%session.SessionId),
		"ID":(id),
		"clsNm": "developer.rest.Sample"
	}
	d ##class(%REST.Impl).%WriteResponse(ret)
    q $$$OK
}
}

<Route>要素の説明

項目説明
Urlエンドポイントのパス
「/:id」のように、パスパラメータも使用可能
MethodHTTPメソッド(例:GET, POST, PUT, DELETE)
 ※任意のHTTPメソッドも使用可能
Call呼び出すクラスメソッド名
Corstrue: CORS許可 ※任意設定

※ 呼び出す関数(今回はtest())は、必ずステータスを返却する必用があります。

別のRESTサービスに転送する

1つのRESTサービスに全てのエンドポイントを詰め込むと、<Route>の数が増加しメンテナンス性が悪化し、手間と時間が掛かるようになります。

そこで、機能が近いグループ毎に、別のRESTサービスへ転送する方法があります。

下記は<Map>要素を使用し、「/test」以降のエンドポイントを「developer.rest.Test」へ転送するサンプルになります。

【サンプルPG】

Class developer.rest.Sample Extends %CSP.REST
{

Parameter CONTENTTYPE = "application/json";

Parameter HandleCorsRequest = 1;

Parameter UseSession = 0;

XData UrlMap
{
<Routes>
	<Route Url="/sample" Method="GET" Call="test" Cors="true"/>
	<Route Url="/sample2/:id" Method="GET" Call="test" Cors="true"/>
	<Map Prefix="/test" Forward="developer.rest.Test"/>
   </Routes>
}

ClassMethod test(id As %Integer = "") As %Status
{
	s ret = {
		"SessionId": (%session.SessionId),
		"ID":(id),
		"clsNm": "developer.rest.Sample"
	}
	d ##class(%REST.Impl).%WriteResponse(ret)
    q $$$OK
}
}
Class developer.rest.Test Extends %CSP.REST
{

Parameter CONTENTTYPE = "application/json";

Parameter HandleCorsRequest = 1;

Parameter UseSession = 0;

XData UrlMap
{
<Routes>
	<Route Url="/check" Method="GET" Call="check" Cors="true"/>
   </Routes>
}

ClassMethod check() As %Status
{
	s ret = {
		"SessionId": (%session.SessionId),
		"clsNm" : "developer.rest.Test"
	}
	d ##class(%REST.Impl).%WriteResponse(ret)
    q $$$OK
}

}

<Map>要素の説明

項目説明
Prefix照合する URL のセグメントを指定
ForwardPrefixに続くセグメントを処理するRESTサービスクラスを指定

サンプルPGの例では、エンドポイントを「/test/check」とする事で、関数「check()」を呼び出します。

RESTサービスが少々ごちゃついていた場合、<Map>要素を利用して整理してみてはいかがでしょうか。

UrlMapのオーバーライド

RESTサービス・クラスをサブクラスとする事で、UrlMapをオーバーライドする事が可能です。
 ※ IRIS 2024.1以降

サブクラスの「Extends」に、継承元のRESTサービス・クラスを指定します。
後は<Routes>要素に「Extend=”true”」を追加して完了です。

【サンプルPG】

Class developer.rest.Override Extends developer.rest.Sample
{

Parameter CONTENTTYPE = "application/json";

Parameter HandleCorsRequest = 1;

Parameter UseSession = 0;

XData UrlMap
{
<Routes Extend="true">
	<Route Url="/over" Method="GET" Call="over" Cors="true" />
</Routes>
}

ClassMethod over(id As %Integer = "") As %Status
{
	s ret = {
		"SessionId": (%session.SessionId),
		"ID":(id),
		"clsNm": "developer.rest.Override"
	}
	d ##class(%REST.Impl).%WriteResponse(ret)
    q $$$OK
}

}

新しいRESTサービスでの動作

スーパークラスのURLも継続して利用可能です

スーパークラスのルートを削除する

システムの更新時に、スーパークラスの一部ルートを削除したい時があります。

その際は、オーバーライドしているサブクラスのUrlMapで、削除したいルートに「Disabled=”true”」を設定する事で、そのルートを削除する事が可能です。

【サンプルPG】 ※一部抜粋

Class developer.rest.Override Extends developer.rest.Sample
{
~~ 略 ~~
XData UrlMap
{
<Routes Extend="true">
    <Route Url="/sample2/:id" Method="GET" Call="test" Cors="true" Disabled="true"/>
	<Route Url="/over" Method="GET" Call="over" Cors="true" />
</Routes>
}
~~ 略 ~~
}

Disabled = trueのルートはエラーが発生するようになりました。

それ以外のルートは生きています。

④ ウェブ・アプリケーションを設定する

RESTクラスの作成が完了したら、管理ポータルよりウェブ・アプリケーションを作成します。

管理ポータルを起動し、[システム管理] > [セキュリティ] > [アプリケーション] > [ウェブ・アプリケーション]をクリックし、ウェブ・アプリケーション設定画面を起動します。

新規ウェブ・アプリケーションの作成

ウェブアプリケーション画面が開いたら、「新しいウェブ・アプリケーション」ボタンをクリックし、ウェブ・アプリケーションの編集画面を開きます。

今回のサンプルは、名称を「/restTest」とし、下記3ヵ所を編集します。

No項目名説明
名前ウェブ・アプリケーションのエイリアス名
「/(スラッシュ)」が先頭に付く
ネームスペース接続先のネームスペース
ディスパッチ・クラス%CSP.RESTを継承したクラス

他の項目に関しては、別の記事にて解説したいと思います。

アプリケーション・ロールの設定

新規ウェブ・アプリケーションが作成できたら、「ロール」を設定します。

ロールを語り始めると長くなるので、今回は「%All」を付与します。

「利用可能」から%Allを選択し、「>」で「選択済み」に移行し「付与する」ボタンのクリックでOKです。

ウェブ・アプリケーションの設定は、大体こんな感じで完了です。

⑤ IISを設定する(windows)

最後は、webサーバへの設定を行います。
今回は、windows製品のIIS(Internet Information Services)での設定を解説します。

IISマネージャ画面を起動し、[【サーバ名】] > [サイト] > [Default Web Site] を右クリックします。
コンテキストより、「アプリケーションの追加」を選択してください。

No項目名説明
エイリアスウェブ・アプリケーションのエイリアス名
IISでは「/(スラッシュ)」を付けない
物理パス一先ず、DATのあるフォルダを設定しておけばいい

ハンドラー マッピングの設定

アプリケーションの設定が完了したら、次はファイルの拡張子に対するリクエストを制御します。

ホームより、「ハンドラーマッピング」を選択します。

ハンドラーマッピング画面の「操作」より、モジュールマップの追加をクリックします。

モジュールマップの追加画面が開くと、①~④の項目を入力・設定します。

No項目名説明
要求パス「*」を入力します
モジュール「CSPms」を選択します
名前任意設定です。
今回は「CSPGateway_rest」と入力しました

要求の制限

「要求の制限」ボタンをクリックし、「マップ」タブより「要求のマップ先が次の場合のみハンドラーを呼び出す」のチェックボックスをOFFにします。

後は「OK」ボタン ×2 をクリックし、ハンドラーマッピングを登録します。

IISの設定は、大体こんな感じで完了です。

おわりに

いかがだったでしょうか。

簡単なサンプルでしたが、ObjectScriptによるRESTサービスの設定方法を解説しました。

UrlMapを手動で設定することで、エンドポイントの構造や振る舞いを細かくコントロールでき、実運用に耐える柔軟なREST APIを構築できます。

本記事をきっかけに、皆さんのプロジェクトでもRESTサービスをより自由に、そして効率的に活用していただければ幸いです。