REST経由で情報を入力する場合の Interoperability(相互運用性機能)のサンプル
これは InterSystems FAQ サイトの記事です。
InterSystems製品のInteroperability(相互運用性機能)を利用する際、REST経由で情報入力を行う場合の作成方法についてサンプルプロダクションを利用しながらご紹介します。
サンプルはこちら👉https://github.com/Intersystems-jp/FAQ-Interop-REST
作成概要
REST経由で情報を受信できるようにIRISでRESTサーバを作成し、対応するメソッドの中からビジネスサービスを呼び出します。
準備するクラスは以下の通りです。
- RESTディスパッチクラス(%CSP.RESTを継承したクラス)
- アダプタを使用しないビジネスサービスクラス
RESTディスパッチクラスの作成方法については、コミュニティの記事:【はじめてのInterSystems IRIS】セルフラーニングビデオ:アクセス編:(REST)手動で作成するディスパッチクラス をご参照ください。
サンプルプロダクションの流れ
指定URLに対してPOST要求で以下のJSONを送付するとビジネスサービスを呼び出し、後続の処理を呼び出します。
{
"Name":"テスト太郎",
"Email":"taro@mail.com"
}例では、エンドポイント /myservice 以下に /request を指定するとRESTディスパッチクラス:FAQSample.REST.clsのメソッド:PostRequest() が実行され、渡された情報からプロダクションで使うメッセージ:FAQSample.Interop.Messageを作成し、アダプタ無しのビジネスサービス:FAQSample.Interop.NonAdapterに作成した情報(メッセージ)を渡します。
情報を受け取ったビジネスサービス:FAQSample.Interop.NonAdapterは、ビジネスプロセス:FAQSample.Interop.Processにメッセージを送信します。
メッセージを受信したビジネスプロセス:FAQSample.Interop.Processでは、メッセージの Name プロパティの値の有無によって以下の処理を実行します。
- 値が空の場合:イベントログに「Nameが空です!」と記録します。
- 値が空ではない場合:ファイルアウトバウンドアダプタを使用したビジネスオペレーション:FAQSample.Interop.FileOperationにメッセージを渡し、ファイル出力を行います。
Interoperabilityの仕組みやコンポーネントの役割については、コミュニティの記事:【はじめてのInterSystems IRIS】Interoperability(相互運用性)を使ってみよう!をご参照ください。
作成方法
1. アダプタのないビジネスサービスを作成する
Ens.BusinessServiceクラスを継承し、アダプタを持たないビジネスサービスクラスを作成します。 (パラメータ:ADAPTERを設定しないビジネスサービスを用意します)
例:FAQSample.Interop.NonAdapter
Class FAQSample.Interop.NonAdapter Extends Ens.BusinessService
{
/// 第1引数はRESTディスパッチクラスで作成したメッセージが格納されるように変更
Method OnProcessInput(pInput As FAQSample.Interop.Message, Output pOutput As%RegisteredObject, ByRef pHint As%String) As%Status
{
set status=..SendRequestAsync("FAQSample.Interop.Process",pInput)
quit status
}
}OnProcessInput()の第1引数のタイプをオリジナルのタイプから入力予定のメッセージクラス名に変更します。(FAQSample.Interop.Message)
後は、第1引数のメッセージを次のコンポーネントであるビジネスプロセス:FAQSample.Interop.Processに送信すればいいので、..SendRequestAsync() の第2引数にOnProcessInput()の第1引数の情報を渡しています。
コンパイルを行った後、作成したビジネスサービスをプロダクションに追加します。
2. ビジネスサービスを呼び出すRESTディスパッチクラスを作成する
%CSP.RESTを継承するRESTディスパッチクラスを作成します。 (例:FAQSample.REST)
/request に対してPOST要求で以下JSONを送付したとき、以下のコードが実行されます。
{
"Name":"テスト太郎",
"Email":"taro@mail.com"
}POST要求のボディに含まれるJSON情報を取得し、サーバ側で処理しやすいようにダイナミックオブジェクトに変換します。
なおHTTP要求はRESTディスパッチクラスの中では %request 変数で操作できます。ボディの情報は Content プロパティでアクセスできます。(この変数は%CSP.Requestのインスタンスです)
set body={}.%FromJSON(%request.Content)ダイナミックオブジェクトからプロダクションで必要なメッセージを作成します。
set request=##class(FAQSample.Interop.Message).%New()
set request.Name=body.Name
set request.Email=body.Email次に、アダプタ無しビジネスサービスのインスタンスを生成します。第1引数はプロダクションに登録したビジネスサービスの名称を指定します。第2引数は生成されたビジネスサービスのインスタンスを格納する変数を参照渡しで指定します。
set status=##class(Ens.Director).CreateBusinessService("FAQSample.Interop.NonAdapter",.bs)戻り値を確認し$$$OKであればインスタンスの生成に成功しているので、ビジネスサービスのProcessInput()メソッドに作成したメッセージクラスを引数に指定し、実行します。
set status=bs.ProcessInput(request)(戻り値を確認し、1が返ってきていれば正常にサービスに情報を送信できています。)
3.エンドポイントを作成する
管理ポータルを使用してエンドポイントを作成します。
管理ポータル > システム管理 > セキュリティ > アプリケーション > ウェブ・アプリケーション > 「新しいウェブ・アプリケーションを作成」ボタンをクリック
図例では、/myservice の名称で USER ネームスペースに配置したRESTディスパッチクラスを指定しています。認証方法には「認証なし」と「パスワード」を設定しています。
4.テスト
設定が正しく行えているかどうか、RESTクライアントからテストします。 (図例はPostmanを使用しています)
次に、ヘッダーを確認します(Content-Typs に application/json;charset=utf-8を指定します)。
ボディを以下のように指定できたら「SEND」ボタンをクリックします。(rawでJSONを指定します)
※ 製品版IRISをご利用の場合、本番運用環境下ではIRISインストール時含まれるプライベートWebサーバ経由でのリクエストではなく、正式なWebサーバ(IISやApacheなど)経由でリクエストしてください。
5.トレースでメッセージを確認
ビジネスサービス:FAQSample.Interop.NonAdapterに入力されたメッセージを確認します。
入力情報のNameの値が空だった場合のメッセージは以下の通りです。(イベントログに「Nameが空です!」と記録されます)
サンプルのインポート
VSCodeを利用している場合は、IRISに接続後、FAQSample以下のファイルを全て保存します(またはFAQSampleを右クリックし、「Import and compile」を選択し一括保存+コンパイルを行います)
この他の方法では、クラス定義の一括エクスポートを行ったファイル:FAQInteropREST-sample.xmlをインポートします。
管理ポータルでインポートする場合は、管理ポータル > システムエクスプローラ > クラス > 対象ネームスペース選択 > インポートボタンクリック後、FAQInteropREST-sample.xmlを選択しインポートします。
インポート後、プロダクション構成画面を開き、ビジネスオペレーション:FAQSample.Interop.FileOperation の「ファイル・パス」を適切な場所に変更してください。
《方法》
管理ポータル > Interoperability > 一覧 > プロダクション に移動したら、FAQSample.Interop.Production の行を選択して「開く」ボタンをクリックします。
オペレーション:FAQSample.Interop.FileOperation の名称をクリックし、画面右の設定欄にある「ファイル・パス」をファイル出力可能なディレクトリに変更します。
変更後、適用ボタンをクリックします。
この設定により、REST経由で送信した情報が「ファイル・パス」で設定したディレクトリ以下に作成される test.txt に出力されます。
変更が完了したら「開始する」ボタンをクリックしてプロダクションを開始します。 (確認のダイアログが出力されるのですべてOKボタンをクリックします。)








