I believe you need to encode "<" and "&" to make it plain text and not part
of the SOAP XML.
"<" should be "<" and "&" should be "&" (if I recall correctly).
/Thorbjørn
-----Original Message-----
From: web400-bounces@xxxxxxxxxxxx [mailto:web400-bounces@xxxxxxxxxxxx] On
Behalf Of Jan Grove Vejlstrup
Sent: 18. september 2013 09:43
To: web400 Midrange
Subject: [WEB400] Passing a xml-string as parameter to a webservice
Hello,
I have a Webservice with this wsdl:
<soapenv:Envelope
xmlns:soapenv="
http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:xsd="
http://kis14tra.wsbeans.iseries/xsd">
    <soapenv:Header/>
    <soapenv:Body>
       <xsd:kis14tra>
          <xsd:args0>
             <xsd:_P0RESULTAT>?</xsd:_P0RESULTAT>
             <xsd:_P0XMLINPUT>?</xsd:_P0XMLINPUT>
          </xsd:args0>
       </xsd:kis14tra>
    </soapenv:Body>
</soapenv:Envelope>
I use the Integrated Webservice (IWS) to implement the Service. As
P0XMLINPUT I want to pass this XML as a string:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Transportimport
ISHOP="9XX">
     <Kunde Nummer="9893" NummerERP="373049" />
     <Pos>
         <ExterneArtikelNr>111246</ExterneArtikelNr>
         <Farbe>111</Farbe>
         <Ausfuehrung>183</Ausfuehrung>
         <Menge>1</Menge>
     </Pos>
     <Pos>
         <ExterneArtikelNr>347213</ExterneArtikelNr>
         <Farbe>100</Farbe>
         <Ausfuehrung>184</Ausfuehrung>
         <Menge>1</Menge>
     </Pos>
</Transportimport>
I use this program and HTTPAPI to test the webservice:
   H bnddir('HTTPAPI')
      H copyright('(c) 2013 WEMAG Consulting AG, CH-3122 Kehrsatz')
       *
      W*E CRTRPGMOD kis144   srcfile(*libl/qrpglesrc)
      W*E+       DBGVIEW(*SOURCE)
      W*E+       REPLACE(*YES)
      W*E CRTPGM kis144   bndsrvpgm(qsysdir/qaxis10ht) actgrp(*new)
      W*E+       REPLACE(*YES)
      W*E DLTMOD kis144
      E*W
       *
       /copy HTTPAPI_H
       /copy apr_b64_h
       /copy iconv_h
       /copy ifsio_h
       /copy errno_h
      D genIconvTable   PR
      D  fromCCSID                    10i 0  const
      D  toCCSID                      10i 0  const
      D convertString   PR         65502a    varying
      D  String                    65502a    const varying options(*varsize)
      D MapXmlData      PR
      d  resultText                32760a
      d  depth                        10i 0
      d  name                       1024a     varying const
      d  path                      24576a     varying const
      d  value                     65535a     varying const
      d  attrs                          *     dim(32767)
      d                                       const options(*varsize)
      d kis144          PR                  ExtPgm('KIS144')
      d kis144          PI
      d VARYINGDATAOFFSET...
      d                 c                     const(2)
      D VARPREF         C                   2
      d ifsPathDec      s            100a    varying
      d fd              s             10i 0
      d err             s             10i 0
      d msg             s             52a   varying
      d SOAP            s           1024a     varying
      d rc              s             10i 0
      d len             s             10i 0
      d xmlInput        s          32765a
      d sizeEnc         s             20i 0
      d resultText      s          32760a
      d decdata         s          32760a
      d encdata         s          32760a
      d encdata1        s          32760a
      d decdata1        s          32760a
      d enclen          s             10i 0
      d declen          s             10i 0
      d table           ds                  likeds(iconv_t)
       /free
            *inlr = *on;
         ifsPathDec = '/jgvtmp/Kis14TraDecUtf02a.xml';
           //   xmlInput = 'iejnppuuttXmL09';
         xmlInput = '<?xml version="1.0" encoding="UTF-8" 
standalone="yes"?>'
            + ' <Transportimport ISHOP="9XX">'
            + '  <Kunde Nummer="9893" NummerERP="373049" FirmaERP="50" />'
            + '  <Pos>'
            + ' <ExterneArtikelNr>111246</ExterneArtikelNr>'
            + '   <Farbe>111</Farbe>'
            + '   <Ausfuehrung>183</Ausfuehrung>'
            + '   <Menge>1</Menge>'
            + '  </Pos>'
            + '  <Pos>'
            + ' <ExterneArtikelNr>347213</ExterneArtikelNr>'
            + '   <Farbe>100</Farbe>'
            + '   <Ausfuehrung>184</Ausfuehrung>'
            + '   <Menge>1</Menge>'
            + '  </Pos>'
            + ' </Transportimport>';
         SOAP=  '<soapenv:Envelope xmlns:soapenv='
              + '"
http://schemas.xmlsoap.org/soap/envelope/"'
              + ' xmlns:xsd="
http://kis14tra.wsbeans.iseries/xsd">'
              + '   <soapenv:Header/>'
              + '   <soapenv:Body>'
              + '      <xsd:kis14tra>'
              + '         <xsd:args0>'
              + '            <xsd:_P0RESULTAT/>'
              + '            <xsd:_P0XMLINPUT>' + %trim(xmlInput)
              + ' </xsd:_P0XMLINPUT>'
              + '         </xsd:args0>'
              + '      </xsd:kis14tra>'
              + '   </soapenv:Body>'
              + '</soapenv:Envelope>';
            len = %len(SOAP);
            msg = 'len *' + %char(len) + '*';
            dsply msg;
        //  http_setCCSIDs(1208 : 0);       **************
            http_debug(*ON: '/jgvtmp/kis14TraDebug.txt');
            rc = http_post_xml('
http://chwemag1:10010/web/services/KIS14TRA'
                             : %addr(SOAP) + VARYINGDATAOFFSET
                             : %len(SOAP)
                             : *NULL
                             : %paddr(MapXmlData)
                             : %addr(resultText)
                             : HTTP_TIMEOUT
                             : HTTP_USERAGENT
                             : 'text/xml; charset=UTF-8'
                             : 'urn.kis14tra');
            if (rc <> 1);
              http_crash();
            endif;
           msg = 'rText*' + %subst(resultText: 1: 30) + '*end';
           dsply msg;
           encdata = resultText;
           msg = 'enclen*' + %char(%len(encdata)) + '*';
           dsply msg;
           declen = apr_base64_decode_binary(decdata
                       : encData);
           msg = 'declen *' + %char(declen) + '*';
           dsply msg;
           genIconvTable(1208: 500);  // convert utf-8  -> EBCDIC
           decdata = convertString(decdata);
           iconv_close(table);
           msg = 'dText*' + %subst(decdata: 1: 30) + '*end';
           dsply msg;
            unlink(ifsPathDec);
            fd = open(ifsPathDec
               : O_CREAT+O_WRONLY+O_TEXTDATA+O_TEXT_CREAT+O_CCSID
               : S_IWUSR+S_IRUSR+S_IRGRP+S_IROTH
               : 1208: 0);
            if fd < 0;
                die('openDec(): '+%str(strerror(errno)));
                return;
             endif;
             callp write(fd: %addr(decdata): declen);
             callp close (fd);
            return;
       /end-free
      P MapXmlData      B
      D MapXmlData      PI
      d  resultText                32760a
      d  depth                        10i 0
      d  name                       1024a     varying const
      d  path                      24576a     varying const
      d  value                     65535a     varying const
      d  attrs                          *     dim(32767)
      d                                       const options(*varsize)
       /free
          if (name='ns:_P0RESULTAT');
            resultText = %trim(value);
          endif;
       /end-free
      P MapXmlData      E
*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
       * genIconvTable
       *
       *  peFromCCSID
       *  peToCCSID
       *
*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      P genIconvTable   B
      d                 PI
      d   peFromCCSID                 10i 0 const
      d   peToCCSID                   10i 0 const
      d i               s             10i 0
      D from            ds                  likeds(QtqCode_T)
      D                                     inz(*LIKEDS)
      D to              ds                  likeds(QtqCode_T)
      D                                     inz(*LIKEDS)
      D errMsg          s             50A   varying
       *
       /free
          from.CCSID  = peFromCCSID;
          to.CCSID    = peToCCSID;
          table = QtqIconvOpen(to: from);
          if (table.return_value = -1);
              ReportError();
          endif;
          return;
       /end-free
      P genIconvTable   E
*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
       * convertString
       *
       *  peString    String to be converted
       *
       *  result is the converted string
*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      P convertString   B
      d                 PI         65502a   varying
      d   peString                 65502a   const varying options(*varsize)
      D VARPREF         C                   2
      D p_input         s               *
      D inleft          s             10U 0
      D p_output        s               *
      D outleft         s             10U 0
      D len             s             10U 0
      D input_data      s          65502a   varying
      D output_data     s          65502a   varying
       *
       /free
          input_data = peString;
          %len(output_data) = %size(output_data) - VARPREF;
          p_input = %addr(input_data) + VARPREF;
          inleft  = %len(input_data);
          p_output = %addr(output_data) + VARPREF;
          outleft  = %len(output_data);
          iconv( table
               : p_input
               : inleft
               : p_output
               : outleft );
          %len(output_data) = %len(output_data) - outleft;
          len = %len(output_data);
          return output_data;
       /end-free
      P convertString   E
       /DEFINE ERRNO_LOAD_PROCEDURE
       /COPY ERRNO_H
My problem is, that the input parameter is empty, when it reaches the
webservice.
If I use the test-function, that comes with the IWS
(chwemag1:2001/HTTPAdmin) the service works all-right:
<soapenv:Envelope><soapenv:Body><q0:kis14tra><q0:args0><q0:_P0RESULTAT/><q0:
_P0XMLINPUT><?xml
version="1.0" encoding="UTF-8" standalone="yes"?> <Transportimport 
ISHOP="9XX">     <Kunde Nummer="9893" NummerERP="373049" />     <Pos> 
<ExterneArtikelNr>111246</ExterneArtikelNr> <Farbe>111</Farbe> 
<Ausfuehrung>183</Ausfuehrung> <Menge>1</Menge>     </Pos>     <Pos> 
<ExterneArtikelNr>347213</ExterneArtikelNr> <Farbe>100</Farbe> 
<Ausfuehrung>184</Ausfuehrung> <Menge>1</Menge>     </Pos> 
</Transportimport></q0:_P0XMLINPUT></q0:args0></q0:kis14tra></soapenv:Body><
/soapenv:Envelope>
Result:
<soapenv:Envelope><soapenv:Body><ns:kis14traResponse><ns:return><ns:_P0RESUL
TAT>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IDxSZXN1bHRhdEtpczE0
dHJhIHZlcnNpb249IjEuMCI+IDxHZW5lcmF0aW9uVGltZXN0YW1wPjIwMTMtMDktMTZUMTQuNDAu
NDQ8L0dlbmVyYXRpb25UaW1lc3RhbXA+ICA8QmFzaXNEYXRlbj4gPEZpcm1hPjAxPC9GaXJtYT4g
PEV4dGVybmVLdW5kZW5OdW1tZXI+OTg1Njc1PC9FeHRlcm5lS3VuZGVuTnVtbWVyPiA8TFRDb2Rl
PkE8L0xUQ29kZT4gPFZlcmthdWZzc3RlbGxlPjAyPC9WZXJrYXVmc3N0ZWxsZT4gPFdlcms+MTAw
PC9XZXJrPiA8QW56YWhsRGV0YWlsUG9zaXRpb25lbj4xMDwvQW56YWhsRGV0YWlsUG9zaXRpb25l
bj4gPC9CYXNpc0RhdGVuPiA8VHJhbnNwb3J0S29zdGVuPjEyMzQuNTY8L1RyYW5zcG9ydEtvc3Rl
bj4gIDwvUmVzdWx0YXRLaXMxNHRyYT4gIA==</ns:_P0RESULTAT></ns:return></ns:kis14t
raResponse></soapenv:Body></soapenv:Envelope>
If I use just a simple text-string as input, it works fine too. It looks
like the XML-file is the problem.
What do I do wrong?
Best regards
Jan
--
This is the Web Enabling the IBM i (AS/400 and iSeries) (WEB400) mailing
list To post a message email: WEB400@xxxxxxxxxxxx To subscribe, unsubscribe,
or change list options,
visit: 
http://lists.midrange.com/mailman/listinfo/web400
or email: WEB400-request@xxxxxxxxxxxx
Before posting, please take a moment to review the archives at
http://archive.midrange.com/web400.
As an Amazon Associate we earn from qualifying purchases.