このステップでは、JSON ソリューションを使用して Web サービスを呼び出すアプリケーション・プログラムを作成します。
エージェント・ソリューションは以下の 2 つのパーツに分かれています。
コード・サンプルは、LANSA ファンクションとして作成されています。詳細は、「ソリューション/Employees/samples/RDMLX.」を参照してください。サンプル・コード SAMPLE_RDMLX_INBOUND_HTTP.TXT を利用してファンクションを作成することができます。必要に応じて独自のコーディングをすることも可能です。
以下は、このクリック・イベント・ルーチンが Web サービス要求を発行しその結果を受け取るために必要なステップの簡単な説明です。
まずはじめに、LANSA フォームは、特定の目的のために特別に設計された組み込み関数を使用して LANSA Integrator JSONサービスとやり取りをすることを覚えておいてください。







上記のコードのすぐ下に 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