ステップ5. iiiFN09クライアントのSET機能をコード化する
このステップでは、クライアントのRDMLXの作成を開始します。クライアントはサーバーに要求ドキュメントを送信し、INT008で作成したサービスから社員リストを受け取ります。現時点では、要求XMLの作成と送信のみをコード化します。
完了したクライアント・ファンクションiiiFN09の全体の構造は以下のようになります。
1. JSMX_OPEN 2. SERVICE_LOAD HTTPOutboundXMLBindService 3. BINDアウトバウンド 4. SET DepartmentRequestフラグメント 5. WRITE DepartmentRequestフラグメント 6. SEND HOST() URI() 7. BINDサービスIIIPRO07_SERVICEインバウンド 8. GET EMPLOYEELISTフラグメント 9. BEGIN_LOOP |
a. GET EMPLOYEEフラグメント b. LEAVE (NOFRAGMENTの場合) c. GET EMPLOYEESKILLSリスト d. SELECT LIST e. エントリーWL_EMPSKLの追加 f. End SELECT |
10. END_LOOP 11. SERVICE_UNLOAD 12. JSMX_CLOSE |
1. プロセスiiiPRO07に属するiiiFN09 Department & Employee Clientという新しいファンクションを作成します。iiiは一意の3文字です。アプリケーションのテンプレートを使用せずにファンクションを作成します。ファンクションをRDMLX対応ファンクションにします。
2. iii TrainingプロジェクトでClient XML Employees Request/samples/RDMLXフォルダーを展開します。SAMPLE_RDMLX_OUTBOUND_HTTP.TXTからコードをコピーして、ファンクションiiiFN09で既存のコードを置き換えます。
3. GROUP_BY DEPARTMENTREQUESTの名前をDEPTREQに変更します。スタジオのコード・ジェネレータは、現在、RDMLXの名前制限を認識していません。これは、フィールドDEPTMENTをバインディングするための参照です。
4. ラッパーRDMLファンクションから作業リストを受け取るように指定する必要があります。
a. ラッパー・ファンクションで定義したように作業リストWL_EMPSKLを定義します。
b. 作業リストWL_EMPSKLを受け入れるRCV_LISTをFUNCTION OPTIONS(*DIRECT)に追加します。
5. SENDコマンドを完了します。HOSTキーワードは、JSMサーバーに関連するWebサーバーを指し示す必要があります。以下のコード例ではIBM i を示しています。ローカルWebサーバーとJSMサーバーを使用している場合は、「localhost」になります。URIキーワードは、IIIFN08_SERVICEというサービスを参照します。コードは以下のようになります。
* Send HTTP request content
CHANGE FIELD(#JSMXCMD) TO('SEND HOST(10.44.10.236:80) URI(/cgi-bin/jsmdirect?IIIFN08_SERVICE)')
USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)
注:XMLバインディングウィザードは、URLキーワードで上記のコードを生成します。これはエラーになるため、上記のコードに示すように、このキーワードをURIに変更してください。
6. 以下に示すように、inbound.classコードへのBINDを削除します。次のステップで、応答ロジックは生成されたサンプルRDMLXから取得されます。
* Bind service to read HTTP response content
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)
* The
following fields are used by the XMLバインディング map
* #DEPTMENT
* The
following fragments are used by the XMLバインディング map
GROUP_BY NAME(#DEPTREQ)
FIELDS(#DEPTMENT)
DEF_LIST NAME(#WL_EMPSKL) FIELDS(#FULLNAME #SKILDESC)
TYPE(*WORKING) ENTRYS(9999)
* Open service
USE BUILTIN(JSMX_OPEN)
TO_GET(#JSMXSTS #JSMXMSG #JSMXHDLE1)
EXECUTE SUBROUTINE(CHECK)
WITH_PARMS(#JSMXSTS #JSMXMSG)
* Load service
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)
* Bind
service to create HTTP request content
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)
* Set fragment -
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)
* Write content
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)
* Close binding
CHANGE FIELD(#JSMXCMD) TO('CLOSE')
USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS
#JSMXMSG)
* Send HTTP request content
CHANGE FIELD(#JSMXCMD) TO('SEND
HOST(10.44.10.236:80) URI(/cgi-bin/jsmdirect?IIIFN08_SERVICE)')
USE
BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS
#JSMXMSG)
EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)
*
<<< Inbound binding logic goes here >>>
* Unload
service
USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 'SERVICE_UNLOAD')
TO_GET(#JSMXSTS #JSMXMSG)
EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS
#JSMXMSG)
* Close service
USE BUILTIN(JSMX_CLOSE) WITH_ARGS(#JSMXHDLE1)
TO_GET(#JSMXSTS #JSMXMSG)
EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS
#JSMXMSG)
* Check routine
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 service error has occured')
ENDIF
ENDROUTINE
7. このファンクションを保存します。まだ終了ではありません。次のステップで完了します。この段階で、サーバー・ファンクションによって、処理するXML要求ドキュメントが送信されています。