このステップでは、JSON ソリューションを使用して Web サービスを呼び出すアプリケーション・プログラムを作成します。
エージェント・ソリューションは以下の 2 つのパーツに分かれています。
- 以前の演習で作成した JSON サービス・アプリケーションを実装するフォーム。
- この JSON サービスを呼び出し、返された応答を処理する RDMLX ファンクション。
コード・サンプルは、LANSA ファンクションとして作成されています。詳細は、「ソリューション/Employees/samples/RDMLX.」を参照してください。サンプル・コード SAMPLE_RDMLX_INBOUND_HTTP.TXT を利用してファンクションを作成することができます。必要に応じて独自のコーディングをすることも可能です。
以下は、このクリック・イベント・ルーチンが Web サービス要求を発行しその結果を受け取るために必要なステップの簡単な説明です。
まずはじめに、LANSA フォームは、特定の目的のために特別に設計された組み込み関数を使用して LANSA Integrator JSONサービスとやり取りをすることを覚えておいてください。
- LANSA エディターを使って、プロセス iiiPRO09 内に新規の RDMLX ファンクション iiiFN11 – 社員取得エージェント を作成します。 今回の場合、アウトバウンド処理には生成のサンプル・コードをコピーするよりは、インバウンド・ファンクションのコードをコピーする方が簡単です。
- Function Options 行のコードを変更して、キーワード Rcv_List(#EMPS) を追加します。これで、社員リストをファンクションを呼び出したフォームに返すことができるようになります。
- 上記の行の後に、リスト EMPS を定義します。フィールドは EMPNO、GIVENAME、SURNAME、SALARY となります。 このリストは Entrys に *MAX が設定された作業リストにしなければいけません。
- 上記の行の後にフィールド DEPTMENT と SECTION のグループを定義します。 これを行わないと、このファンクション内にこれらのフィールドへの参照が無いことになり、フィールド DEPTMENT と SECTION を JSON サーバーの送信することができません。
- 上の行の次に、リスト EMPS をクリアする行を加えます。
- ファンクション iiiFN10 に切り替えて、JSM を開いてサービスをロードするコードの箇所をコピーして、iiiFN11 の上記の行の後に貼り付けます。 そして、HTTPInboundJSONBindService を HTTPOutboundJSONBindService に変更します。
- ファンクション iiiFN10 に戻り、CHECK サブルーチンをコピーして、iiiFN11 に貼り付けます。その他のコードもすべて貼り付け、このサブルーチンがファンクションの最後になるようにします。
- 再びファンクション iiiFN10 に切り替え、サービス IIIEMPLOYEEDEPTSECT をバインドするコードをコピーして、Lord サービスの後に貼り付けます。 TYPE を *OUTBOUND に変更します。
上記のコードのすぐ下に JSON オブジェクトを作成するコード (WRITE BINDTRACE(*YES)) と要求を送信するコード (SEND HOST…) を追加します。 URL は HOST と URI に分けなければいけないことに注意してください。
注:この URI が「INT010A - JSONサービス - サーバー側のロジックを定義」で定義した Direct サービス IIIEMPLOYEEJSON を実行しています。HOST の値はサーバーとポート番号でなければいけません。
上記 #3 から BIND SERVICE ロジックをコピーし、さきほどのコードの続きに貼り付けます。 そして、IIIEMPLOYEEDEPTSECT を IIIEMPLOYEE に変更し、TYPE を *INBOUND に変えます。 このコードにより、応答が受信され、処理が行えるようになります。 今回の場合、処理というのは、リスト処理のみです。 リストだけでなく、簡素な複数のフィールドも存在する場合は、これらのフィールドもこの時点でファンクションのフィールドにバインドされます。
すべての EMPLOYEE フラグメントを見ていき、このフラグメントがこれ以上見つからなくなるまでループするコードを追加して、各フラグメントのデータをリストに加えていきます。 ファンクション iiiFN10 の Begin_Loop の後の 3 行をコピーして、SET を GET に変更します。
上記の行の続きに、JSM を閉じて、ファンクションに戻るロジックを加えます。
ファンクション iiiFN11 をコンパイルします。必要に応じて、これを IBM i サーバーにチェックインします。
コードは以下のようになります。FUNCTION OPTIONS(*DIRECT) RCV_LIST(#emps)DEF_LIST NAME(#EMPS) FIELDS(#EMPNO #GIVENAME #SURNAME #SALARY) TYPE(*WORKING) ENTRYS(*MAX)GROUP_BY NAME(#parms) FIELDS(#deptment #section)CLR_LIST NAMED(#emps)
*サービスを開くUSE BUILTIN(JSMX_OPEN) TO_GET(#JSMXSTS #JSMXMSG #JSMXHDLE1)EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)*サービスのロードCHANGE FIELD(#JSMXCMD) TO('SERVICE_LOAD SERVICE(HTTPOutboundJSONBindService) SERVICE_CONTENT(*HTTP) TRACE(*YES)')USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)*サービスをバインドして、HTTP 要求コンテンツを読み込むCHANGE FIELD(#JSMXCMD) TO('BIND SERVICE(IIIEMPLOYEEDEPTSECT) TYPE(*OUTBOUND) BINDTRACE(*YES) SERVICE_EXCHANGE(*FIELD)')USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)*Create the JSON object#JSMXCMD := 'WRITE BINDTRACE(*YES)'USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)*要求の送信#JSMXCMD := 'SEND HOST(earthd14.lansa.co.uk:80) URI(/cgi-bin/jsmdirect?IIIEMPLOYEEJSON)'USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)*サービスをバインドして HTTP 応答コンテンツを処理CHANGE FIELD(#JSMXCMD) TO('BIND SERVICE(IIIEMPLOYEES) TYPE(*INBOUND) BINDTRACE(*YES) SERVICE_EXCHANGE(*FIELD)')USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)*社員の処理BEGIN_LOOP#JSMXCMD := 'GET FRAGMENT(EMPLOYEE) SERVICE_EXCHANGE(*FIELD)'USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)LEAVE IF(#JSMXSTS = NOFRAGMENT)ADD_ENTRY TO_LIST(#emps)END_LOOP*サービスのクローズUSE BUILTIN(JSMX_CLOSE) WITH_ARGS(#JSMXHDLE1) TO_GET(#JSMXSTS #JSMXMSG)EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)*Check ルーチンSUBROUTINE NAME(CHECK) PARMS((#JSMXSTS *RECEIVED) (#JSMXMSG *RECEIVED))IF COND('#JSMXSTS *NE OK')USE BUILTIN(JSMX_CLOSE) WITH_ARGS(#JSMXHDLE1) TO_GET(#JSMXSTS #JSMXMSG)EXITENDIFENDROUTINE










