|
Hello Jan,
You'll need to escape your XML tags in the 'xmlInput' variable before
you add them to the SOAP message.
Otherwise, the IWS will think your XML message is also part of the SOAP
message.
You won't have to do anything special on the server side, since the IWS
will un-escape them before passing them into the server-side RPG program.
On 9/18/2013 2:43 AM, Jan Grove Vejlstrup wrote:
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?
Best regards
Jan
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.