CELSIUS

This example program demonstrates the basic structure of an RPG program utilizing RPG-XML Suite to compose an XML request, call a remote web service, and parse the response XML with event-based parsing.

CELSIUS Program


H DEBUG(*YES) DFTACTGRP(*NO) BNDDIR('RXSBND') ACTGRP(*CALLER)

 /DEFINE RXSV6R1

 /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

   *Inlr = *On;

   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' ) + '°');
     ErrorDS.ThrowToCaller = RXS_YES;
     RXS_Throw( ErrorDS );
   on-error;

   endmon;


   begsr compose;

     RXS_ResetDS( ComposeDS : RXS_DS_TYPE_COMPOSE );
     ComposeDS.TemplateProcedure = %paddr(Template);
     RXS_StartComposeEngine(ComposeDS);

     RXS_ComposeVariable( fahrenheit : %Char(gFahrenheit) );
     RXS_ComposeSection( content );

     RXS_GetComposeBuffer(gXmlRequest);

   endsr;


   begsr transmit;

     RXS_ResetDS( TransmitDS : RXS_DS_TYPE_TRANSMIT );
     TransmitDS.URI =
       'http://www.w3schools.com/webservices/tempconvert.asmx';
     TransmitDS.HeaderSOAPAction =
       '"http://www.w3schools.com/webservices/FahrenheitToCelsius"';
     TransmitDS.LogFile = '/tmp/celsius.txt';
     TransmitDS.HeaderContentType = 'text/xml; charset=utf-8';
     TransmitDS.RequestCcsid = RXS_CCSID_UTF8;
     RXS_Transmit( gXmlResponse : 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 XmlHandler      PI
D  pType                        10A   Value
D  pXPath                     1024A   Value Varying
D  pData                          *   Value
D  pDataLen                     10I 0 Value
D
D parsed          S                   Like(RXS_Var1Kv_t)
 /free

   if pXPath =
      '/Envelope/Body/FahrenheitToCelsiusResponse' +
      '/FahrenheitToCelsiusResult/';

     // Calling RXS_STR in the V6R1-style forces you to use an
     //  intermediate variable when you need to convert type to
     //  integer or decimal. In V7R1-style, the below two lines of
     //  code would be a single line that looks like this:
     //      gCelsius = %Int( RXS_STR( pData : pDataLen ) );
     RXS_STR( parsed : pData : pDataLen );
     gCelsius = %Int( parsed );
   endif;

 /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 following command:

  //     CRTRPGTPL STMF('/www/rxs/templates/geturi2.tpl')
  //       FILE(RXS3/QRPGLETPL) MBR(CELSIUS)

  // 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 Template


 /IF NOT DEFINED(CELSIUS)
 /DEFINE CELSIUS
D
D                 DS
D  CONTENT...
D                               50A   Varying
D
D                 DS
D  fahrenheit...
D                               30A   Varying
 /EOF
 /ENDIF
 /free

   CONTENT =
     'CONTENT';
   fahrenheit =
     'fahrenheit';

  p  = '';
  p += '::CONTENT' + x'15';
  p += '' + x'15';
  p += '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-i';
  p += 'nstance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:';
  p += 'soap="http://schemas.xmlsoap.org/soap/envelope/">' + x'15';
  p += '  ' + x'15';
  p += '    ' + x'15';
  p += '      ' + '.:fahrenheit:.' + '' + x'15';
  p += '    ' + x'15';
  p += '  ' + x'15';
  p += '</soap:Envelope>' + x'15';

 /end-free