# Example 2 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 the DOM parser. ### Free Format EX2.rpgle ```rpgle **FREE Ctl-Opt ActGrp(*Caller) BndDir('RXSBND') Option(*NoDebugIO) ExtBinInt(*Yes) DecEdit('0.') Text('Ex. 2 - Celsius SOAP XML DOM'); /COPY QRPGLECPY,RXSCB /COPY QRPGLETPL,CELSIUS Dcl-S gData Like(RXS_Var1Kv_t); Dcl-S gCelsius Int(10); Dcl-S gFahrenheit Int(10); Dcl-S gXmlRequest Like(RXS_Var64Kv_t); Dcl-S gXmlResponse Like(RXS_Var64Kv_t); Dcl-S gXPath Like(RXS_Var8Kv_t); Dcl-Ds ComposeDs LikeDS(RXS_ComposeDS_t); Dcl-Ds TransmitDS LikeDS(RXS_TransmitDS_t); Dcl-Ds RootDomDS LikeDS(RXS_ParseDomDS_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; RootDomDS = RXS_OpenDom( gXmlResponse ); gXPath = RXS_XPath( '/*:Envelope/*:Body/*:FahrenheitToCelsiusResponse' + '/*:FahrenheitToCelsiusResult' ); gData = RXS_ParseDomToText( gXPath : RootDomDS ); RXS_CloseDom( RootDomDS ); gCelsius = %Int( gData ); endsr; 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_EX2.rpgle ```rpgle H DFTACTGRP(*NO) ACTGRP(*CALLER) BNDDIR('RXSBND') OPTION(*NODEBUGIO) H EXTBININT(*YES) DECEDIT('0.') H TEXT('Fixed Format Ex. 2 - Celsius SOAP XML DOM') /COPY QRPGLECPY,RXSCB /COPY QRPGLETPL,CELSIUS D Template PR D p Like(RXS_TEMPLATE_PARM) D gData S Like(RXS_Var1Kv_t) D gCelsius S 10I 0 D gFahrenheit S 10I 0 D gXmlRequest S Like(RXS_Var64Kv_t) D gXmlResponse S Like(RXS_Var64Kv_t) D gXPath S Like(RXS_Var8Kv_t) D ComposeDS DS LikeDS(RXS_ComposeDS_t) D TransmitDS DS LikeDS(RXS_TransmitDS_t) D RootDomDS DS LikeDS(RXS_ParseDomDS_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; RootDomDS = RXS_OpenDom( gXmlResponse ); gXPath = RXS_XPath('/*:Envelope/*:Body/*:FahrenheitToCelsiusResponse' + '/*:FahrenheitToCelsiusResult' ); gData = RXS_ParseDomToText( gXPath : RootDomDS ); RXS_CloseDom( RootDomDS ); gCelsius = %Int( gData ); endsr; /end-free 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 ```