[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Passing XML-file 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:_P0RESULTAT>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IDxSZXN1bHRhdEtpczE0dHJhIHZlcnNpb249IjEuMCI+IDxHZW5lcmF0aW9uVGltZXN0YW1wPjIwMTMtMDktMTZUMTQuNDAuNDQ8L0dlbmVyYXRpb25UaW1lc3RhbXA+ICA8QmFzaXNEYXRlbj4gPEZpcm1hPjAxPC9GaXJtYT4gPEV4dGVybmVLdW5kZW5OdW1tZXI+OTg1Njc1PC9FeHRlcm5lS3VuZGVuTnVtbWVyPiA8TFRDb2RlPkE8L0xUQ29kZT4gPFZlcmthdWZzc3RlbGxlPjAyPC9WZXJrYXVmc3N0ZWxsZT4gPFdlcms+MTAwPC9XZXJrPiA8QW56YWhsRGV0YWlsUG9zaXRpb25lbj4xMDwvQW56YWhsRGV0YWlsUG9zaXRpb25lbj4gPC9CYXNpc0RhdGVuPiA8VHJhbnNwb3J0S29zdGVuPjEyMzQuNTY8L1RyYW5zcG9ydEtvc3Rlbj4gIDwvUmVzdWx0YXRLaXMxNHRyYT4gIA==</ns:_P0RESULTAT></ns:return></ns:kis14traResponse></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? Can I user another http-function or other parameters?

Best regards

Jan


-----------------------------------------------------------------------
This is the FTPAPI mailing list.  To unsubscribe, please go to:
http://www.scottklement.com/mailman/listinfo/ftpapi
-----------------------------------------------------------------------