ステップ 5. iiiFN07 クライアントのSET機能をコーディングする
INT008 – 部門&社員クライアント (オプション)
このステップでは、クライアントの RDMLX の作成を開始します。クライアントはサーバーに要求ドキュメントを送信し、INT007 で作成したサービスから社員リストを受け取ります。現時点では、要求 XML の作成と送信のみコーディングします。
完成したクライアント・ファンクション iiiFN07 の全体の構造は以下のようになります。
1. JSMX_OPEN |
a. GET EMPLOYEE フラグメント |
10. END_LOOP |
1. iiiPRO07 - JSM XML 社員クライアントという名前で新規 LANSA プロセスを作成します。iiiは一意の3文字です。(同じ名前のプロセスがすでにある場合は、iii に対して別の文字セットを選択します)。
2. プロセス iiiPRO07 に属する iiiFN07 部門&社員クライアントという名前の新規ファンクションを作成します。(iii は一意の 3 文字)アプリケーションのテンプレートを使用せずにファンクションを作成します。ファンクションはRDMLX 対応にします。
3. iii 研修プロジェクトで、クライアント XML 社員要求/samples/RDMLX フォルダを展開します。SAMPLE_RDMLX_OUTBOUND_HTTP.TXT のコードをコピーして、ファンクション iiiFN07 の既存のコードと置き換えます。
4. GROUP_BY DEPARTMENTREQUEST の Name を DEPTREQ に変更します。スタジオのコード・ジェネレータは、現在、RDMLX の名前制限を認識していません。これは、フィールド DEPTMENT をバインドするための参照です。
5. フォーム iiiFRM03 から作業リストを受け取るよう指定する必要があります。
a. このフォームで定義されているように、作業リスト WL_EMPSKL を定義します。
b. 作業リスト WL_EMPSKL を受け入れる RCV_LIST キーワードを FUNCTION OPTIONS(*DIRECT) に追加します。
6. フィールド SKILDESC に対して作業リスト EMPSKILLS を定義します。これは、サーバー・ファンクション iiiFN06 からの応答 XML にバインドすることでデータが投入される社員スキルのリストです。
def_list name(#empskills) fIELDS(#skildesc) type(*working) entrys(*max)
7. SEND コマンドを完了します。HOSTキーワードは、JSMサーバーに関連するWebサーバーを指し示す必要があります。以下のサンプル・コードでは IBM i ホストを指しています。
注意:ローカルの Windows Web サーバーや JSM サーバーを使用している場合、URI は以下のようになります。 /cgi-bin/jsmdirect.exe?IIIFN06_SERVICE
URIキーワードは iiiFN06_SERVICE というサービスを参照します。コードは以下のようになります。
- HTTP 要求コンテンツの送信
CHANGE FIELD(#JSMXCMD) TO('SEND HOST(10.44.10.236:80) URI(/cgi-bin/jsmdirect?IIIFN06_SERVICE)')
USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)
8. 以下に示すように、bound.class コードへの BIND を削除します。応答ロジックは、次のステップで、生成サンプル RDMLX から取得します。 - サービスをバインドして HTTP 応答コンテンツを読み込む
CHANGE FIELD(#JSMXCMD) TO('BIND SERVICE( <<<inbound.class>>> ) TYPE(*INBOUND) BINDTRACE(*YES)')
USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)
現時点でRDMLXコードは以下のようになります。
FUNCTION OPTIONS(*DIRECT) RCV_LIST(#wl_empskl) - 以下のフィールドは xml バインド・マップで使用
- #DEPTMENT
- 以下のフラグメントは xml バインド・マップで使用
GROUP_BY NAME(#DEPTREQ) FIELDS(#DEPTMENT)
DEF_LIST NAME(#WL_EMPSKL) FIELDS(#FULLNAME #SKILDESC) TYPE(*WORKING) ENTRYS(*MAX)
DEF_LIST NAME(#empskills) FIELDS(#skildesc) TYPE(*working) ENTRYS(*max) - サービスを開く
USE BUILTIN(JSMX_OPEN) TO_GET(#JSMXSTS #JSMXMSG #JSMXHDLE1)
EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)
- サービスのロード
CHANGE FIELD(#JSMXCMD) TO('SERVICE_LOAD SERVICE(HTTPOutboundXMLBindService) 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(IIIPRO07_REQUEST) TYPE(*OUTBOUND)')
USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)
- フラグメント設定 - DEPARTMENTREQUEST
CHANGE FIELD(#JSMXCMD) TO('SET FRAGMENT(DEPARTMENTREQUEST) SERVICE_EXCHANGE(*FIELD)')
USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)
- コンテンツの書き込み
CHANGE FIELD(#JSMXCMD) TO('WRITE INDENT(*YES) BINDTRACE(*YES)')
USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)
- バインドを閉じる
CHANGE FIELD(#JSMXCMD) TO('CLOSE')
USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)
- HTTP 要求コンテンツの送信
CHANGE FIELD(#JSMXCMD) TO('SEND HOST(10.44.10.236:80) URI(/cgi-bin/jsmdirect?IIIFN06_SERVICE)')
USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG) - <<< インバウンドのロジックはここ >>>
- サービスのアンロード
USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 'SERVICE_UNLOAD') TO_GET(#JSMXSTS #JSMXMSG)
EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG) - サービスのクローズ
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)
MENU MSGTXT('Java サービス・エラーが発生しました')
ENDIF
ENDROUTINE
9. このファンクションを保存します。
注:まだ終了ではありません。次のステップで完了します。この段階で、サーバー・ファンクションによって、処理するXML要求ドキュメントが送信されています。