# Example 1 This example program demonstrates the basic structure of an RPG program utilizing RXS to compose an XML request, call a remote web service, and parse the response XML with event-based parsing. ### Free Format EX1.rpgle ```rpgle **FREE Ctl-Opt ActGrp(*Caller) BndDir('RXSBND') Option(*NoDebugIO) ExtBinInt(*Yes) DecEdit('0.') Text('Ex. 1 - Celsius SOAP XML'); /COPY QRPGLECPY,RXSCB /COPY QRPGLETPL,CELSIUS Dcl-S gFahrenheit Int(10); Dcl-S gCelsius Int(10); Dcl-S gXmlRequest Like(RXS_Var64Kv_t); Dcl-S gXmlResponse Like(RXS_Var64Kv_t); Dcl-Ds ComposeDS LikeDS(RXS_ComposeDS_t); Dcl-Ds TransmitDS LikeDS(RXS_TransmitDS_t); Dcl-Ds ParseDS LikeDS(RXS_ParseDS_t); Dcl-Ds ErrorDS LikeDS(RXS_CatchThrowErrorDS_t); monitor; gFahrenheit = 100; exsr compose; exsr transmit; exsr parse; RXS_ResetDS( ErrorDS : RXS_DS_TYPE_CATCHTHROWERROR ); ErrorDS.MessageId = 'RXS9897'; ErrorDS.MessageData = 'Celsius Temp: ' + %Trim ( %EditC( gCelsius : '3' ) ) + ' degrees' ; ErrorDS.ThrowToCaller = RXS_YES; RXS_Throw( ErrorDS ); on-error; endmon; *INLR = *On; return; begsr compose; RXS_ResetDS( ComposeDS : RXS_DS_TYPE_COMPOSE ); ComposeDS.TemplateProcedure = %Paddr( Template ); RXS_StartComposeEngine( ComposeDS ); RXS_ComposeVariable( fahrenheit : %Char( gFahrenheit ) ); RXS_ComposeSection( content ); gXmlRequest = RXS_GetComposeBuffer(); endsr; begsr transmit; RXS_ResetDS( TransmitDS : RXS_DS_TYPE_TRANSMIT ); TransmitDS.URI = 'https://www.w3schools.com/xml/tempconvert.asmx'; TransmitDS.HeaderSOAPAction = '"https://www.w3schools.com/xml/FahrenheitToCelsius"'; TransmitDS.LogFile = '/tmp/celsius.txt'; TransmitDS.HeaderContentType = 'text/xml; charset=utf-8'; TransmitDS.RequestCcsid = RXS_CCSID_UTF8; // SSL Certificates should always be installed for security reasons, // but for now ignore any missing certificates // See this page for instructions on installing needed certificates: // https://isupport.katointegrations.com/rxs/installing_certificate_authorities/ // For example purposes only, turnoff SSL Verification. TransmitDS.SSLVerifyHost = RXS_NO; gXmlResponse = RXS_Transmit( gXmlRequest : TransmitDS ); endsr; begsr parse; RXS_ResetDS( ParseDS : RXS_DS_TYPE_PARSE ); ParseDS.GlobalHandler = %Paddr( XmlHandler ); RXS_Parse( gXmlResponse : ParseDS ); endsr; Dcl-Proc XmlHandler; Dcl-Pi *N; pType Char(10) Value; pXPath VarChar(1024) Value; pData Pointer Value; pDataLen Int(10) Value; End-Pi; Dcl-S ParsedData Like(RXS_Var1Kv_t); select; when pXPath = '/Envelope/Body/FahrenheitToCelsiusResponse' + '/FahrenheitToCelsiusResult/'; monitor; ParsedData = RXS_STR( pData : pDataLen ); gCelsius = %Int( ParsedData ); on-error 105; gCelsius = 0; endmon; endsl; End-Proc; Dcl-Proc Template; Dcl-Pi *N; p Like(RXS_TEMPLATE_PARM); End-Pi; // Template RPG source was created from the actual template // STMF using the CRTRPGTPL command. // // The RPG Template source is copied from QRPGLETPL by using // /copy once in the D-specs and again below. /COPY QRPGLETPL,CELSIUS End-Proc; ``` ### Fixed Format FX_EX1.rpgle ```rpgle H DFTACTGRP(*NO) ACTGRP(*CALLER) BNDDIR('RXSBND') OPTION(*NODEBUGIO) H EXTBININT(*YES) DECEDIT('0.') H TEXT('Fixed Format Ex. 1 - Celsius SOAP XML') /COPY QRPGLECPY,RXSCB /COPY QRPGLETPL,CELSIUS D Template PR D p Like(RXS_TEMPLATE_PARM) D XmlHandler PR D pType 10A Value D pXPath 1024A Value Varying D pData * Value D pDataLen 10I 0 Value D gFahrenheit S 10I 0 D gCelsius S 10I 0 D gXmlRequest S Like(RXS_Var64Kv_t) D gXmlResponse S Like(RXS_Var64Kv_t) D ComposeDS DS LikeDS(RXS_ComposeDS_t) D TransmitDS DS LikeDS(RXS_TransmitDS_t) D ParseDS DS LikeDS(RXS_ParseDS_t) D ErrorDS DS LikeDS(RXS_CatchThrowErrorDS_t) /free monitor; gFahrenheit = 100; exsr compose; exsr transmit; exsr parse; RXS_ResetDS( ErrorDS : RXS_DS_TYPE_CATCHTHROWERROR ); ErrorDS.MessageId = 'RXS9897'; ErrorDS.MessageData = 'Celsius Temp: ' + %Trim ( %EditC( gCelsius : '3' ) + 'degrees'); ErrorDS.ThrowToCaller = RXS_YES; RXS_Throw( ErrorDS ); on-error; endmon; *INLR = *On; return; begsr compose; RXS_ResetDS( ComposeDS : RXS_DS_TYPE_COMPOSE ); ComposeDS.TemplateProcedure = %Paddr(Template); RXS_StartComposeEngine(ComposeDS); RXS_ComposeVariable( fahrenheit : %Char(gFahrenheit) ); RXS_ComposeSection( content ); gXmlRequest = RXS_GetComposeBuffer(); endsr; begsr transmit; RXS_ResetDS( TransmitDS : RXS_DS_TYPE_TRANSMIT ); TransmitDS.URI = 'https://www.w3schools.com/xml/tempconvert.asmx'; TransmitDS.HeaderSOAPAction = '"https://www.w3schools.com/xml/FahrenheitToCelsius"'; TransmitDS.LogFile = '/tmp/celsius.txt'; TransmitDS.HeaderContentType = 'text/xml; charset=utf-8'; TransmitDS.RequestCcsid = RXS_CCSID_UTF8; // SSL Certificates should always be installed for security reasons, // but for now ignore any missing certificates // See this page for instructions on installing needed certificates: // https://isupport.krengeltech.com/rxs/installing_certificate_authorities/ // For example purposes only, turnoff SSL Verification. TransmitDS.SSLVerifyHost = RXS_NO; gXmlResponse = RXS_Transmit( gXmlRequest : TransmitDS ); endsr; begsr parse; RXS_ResetDS( ParseDS : RXS_DS_TYPE_PARSE ); ParseDS.GlobalHandler = %Paddr( XmlHandler ); RXS_Parse( gXmlResponse : ParseDS ); endsr; /end-free P XmlHandler B D PI D pType 10A Value D pXPath 1024A Value Varying D pData * Value D pDataLen 10I 0 Value D D ParsedData S Like(RXS_Var1Kv_t) /free select; when pXPath = '/Envelope/Body/FahrenheitToCelsiusResponse' + '/FahrenheitToCelsiusResult/'; monitor; ParsedData = RXS_STR( pData : pDataLen ); gCelsius = %Int( ParsedData ); on-error 105; gCelsius = 0; endmon; endsl; /end-free P E P Template B D PI D p Like(RXS_TEMPLATE_PARM) // Template RPG source was created from the actual template // STMF using the CRTRPGTPL command. // // The RPG Template source is copied from QRPGLETPL by using // /copy once in the D-specs and again below. /COPY QRPGLETPL,CELSIUS P E ``` ### CELSIUS.tpl ```rpgle /IF NOT DEFINED(CELSIUS) /DEFINE CELSIUS D CONTENT... D C 'CONTENT' D fahrenheit... D C 'fahrenheit' /ELSE /FREE p = ''; p += '::CONTENT' + x'15'; p += '' + x'15'; p += '' + x'15'; p += ' ' + x'15'; p += ' ' + x'15'; p += '' + x'15'; /END-FREE /ENDIF ```