ステップ2. iiiFN06サーバーのSET機能をコード化する
このステップでは、データベース・ファイルDEPTABにアクセスして部門名称を取得するRDMLXを作成します。クライアント要求に応答するサーバー側SENDのRDMLXを作成します。
1. ファンクションiiiFN06を使用し、DEPARTMENTREQUESTフラグメントからGETを実行した後、強調表示されている以下のブロックを削除します。
次に、DEPTDESCフィールドを消去し、DEPTABファイルからDEPTMENTキー(部門コード)でDEPTDESCフィールド(部門名称)を取得するRDMLXコードを作成します。
FETCH操作のI/Oステータスを確認します。*OKAY以外の場合、部門名称をリテラル'Department not found'に変更します。
RDMLXコードは以下のように表示されます。
#DEPTDESC := *NULL
FETCH FIELDS(#DEPTDESC) FROM_FILE(DEPTAB) WITH_KEY(#DEPTMENT) IO_ERROR(*NEXT) VAL_ERROR(*NEXT)
IF_STATUS IS_NOT(*OKAY)
#DEPTDESC := 'Department Not Found'
ENDIF
2. アウトバウンドHTTP内容を作成するコードを追加する必要があります。XML応答ソリューション用にスタジオで生成されたRDMLXから、このコード・フラグメントを取得できます。フォルダーXML
Response/samples/RDMLXを展開し、テキスト・エディタでSAMPLE_RDMLX_OUTBOUND_HTTP.txtを開きます。ファンクションiiiFN06の以下のコメントの直後に、強調表示されたコードをコピーします。
* <<< Outbound binding logic goes here
>>>
3. CHECKサブルーチンで、エラーが発生した場合はプログラムが終了するようにABORTコマンドをIF..ENDIF条件に追加します。
4. ファンクションをコンパイルします。
5. IBM i のJSMサーバーを使用している場合は、ファンクションをIBM i に登録してコンパイルします。
完了したRDMLXコードは以下のように表示されます。
FUNCTION OPTIONS(*DIRECT)
* 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)
* 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(HTTPInboundXMLBindService)
SERVICE_CONTENT(*HTTP) TRACE(*YES)')
USE BUILTIN(JSMX_COMMAND)
WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
EXECUTE
SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)
* Bind service to read HTTP
request content
CHANGE FIELD(#JSMXCMD) TO('BIND SERVICE(IIIPRO04_REQUEST)
TYPE(*INBOUND) BINDTRACE(*YES)')
USE BUILTIN(JSMX_COMMAND)
WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
EXECUTE
SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)
* Get fragment -
DEPTREQ
CHANGE FIELD(#JSMXCMD) TO('GET FRAGMENT(DepartmentRequest)
SERVICE_EXCHANGE(*FIELD)')
USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1
#JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
EXECUTE SUBROUTINE(CHECK)
WITH_PARMS(#JSMXSTS #JSMXMSG)
* handle request for department
description
#deptdesc := *blanks
FETCH FIELDS(#deptdesc) FROM_FILE(deptab)
WITH_KEY(#deptment) IO_ERROR(*NEXT) VAL_ERROR(*NEXT)
IF_STATUS
IS_NOT(*OKAY)
#deptdesc := ('Department not found')
ENDIF
*
<<< Outbound binding logic goes here >>>
* Bind service to
create HTTP request content
CHANGE FIELD(#JSMXCMD) TO('BIND
SERVICE(IIIPRO04_RESPONSE) TYPE(*OUTBOUND)')
USE BUILTIN(JSMX_COMMAND)
WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
EXECUTE
SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)
* Set fragment -
DEPARTMENTRESPONSE
CHANGE FIELD(#JSMXCMD) TO('SET
FRAGMENT(DEPARTMENTRESPONSE) 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)
* Send HTTP response content
CHANGE FIELD(#JSMXCMD)
TO('SEND')
USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD)
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)
ABORT
ENDIF
ENDROUTINE