
本記事は、ObjectScriptでのRESTサービスの構築(手動版)について解説します。
はじめに
Python、Java、Node.js など、さまざまな言語で REST サービスの構築が行われています。
今や REST サービスは特別なものではなく、システム間連携や外部アプリケーションとのデータ連携を実現するための必須要素となっています。
IRIS/Caché においても例外ではなく、クラス「%CSP.REST」を用いることで、REST 形式の Web サービスを比較的容易に構築することが可能です。
本記事では、ObjectScript を使ってREST サービスをどのように構築するのかについて、実際のコード例を交えながら解説します。
それでは、さっそく REST サービスを作成していきましょう。
RESTサービスの構築(手動版)
作業工程の確認
RESTサービスを手動で作成・設定するには、下記手順を行っていきます。
では、順に確認していきましょう。
① %CSP.REST.clsを継承したクラスを作成する
先ずはRESTサービスの基本となる、「RESTサービス・クラス」を作成します。
今回はサンプルクラスとして、名称を「developer.rest.Sample」とし、「%CSP.REST」を継承させます。
【サンプルPG】
Class developer.rest.Sample Extends %CSP.REST
{
}② パラメータ設定
空のクラスが作成出来たら、次はパラメータの設定を行います。
下記は、システムで設定されているパラメータの一部です。
| パラメータ名 | 設定値 | 説明 |
|---|---|---|
| CONTENTTYPE | text/html | Content-Typeを設定する |
| HandleCorsRequest | null | CORSサポート関連。 CORS処理の決定はURLマップルートの設定に委任される null:未設定(default) 1:CORS処理がオン 0:CORS処理がオフ |
| UseSession | 0 | CSPセッションの制御を設定する。 1:CSPセッションを継続する 0:接続毎に新規CSPセッションを作成する |
| CHARSET | UTF-8 | ページのデフォルトの文字セットを指定する |
| CONVERTINPUTSTREAM | 0 | %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」のように、パスパラメータも使用可能 |
| Method | HTTPメソッド(例:GET, POST, PUT, DELETE) ※任意のHTTPメソッドも使用可能 |
| Call | 呼び出すクラスメソッド名 |
| Cors | true: 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 のセグメントを指定 |
| Forward | Prefixに続くセグメントを処理する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サービスをより自由に、そして効率的に活用していただければ幸いです。

