in reply to Re: Using Perl's SOAP::Lite to talk to Python
in thread Using Perl's SOAP::Lite to talk to Python

I have coerced Python into talking to a Perl SOAP server in the past (about 1 year ago), but the code is long gone. The main problem i had was with complex Perl structures. The reason i am replying, however, is because i did indeed have troubles coercing Python into dealing with a complex Perl data structure.

For those who don't already know, a reference/data structure in one language is translated to another language through SOAP via XML elements. For example, here is what a SOAP::Lite string looks like:

$arg = 'Hello SOAP' <s-gensym3 xsi:type="xsd:string">Hello SOAP</s-gensym3>
Python's SOAP.py library encodes a string like so:
<Result xsi:type="xsd:string">Hello SOAP</Result>
Here is a Perl array (or hash):
@arg = qw(foo bar baz qux) <s-gensym3 xsi:type="xsd:string">foo</s-gensym3> <s-gensym5 xsi:type="xsd:string">bar</s-gensym5> <s-gensym7 xsi:type="xsd:string">baz</s-gensym7> <s-gensym9 xsi:type="xsd:string">qux</s-gensym9>
Which is very similar to a Python array:
<item xsi:type="xsd:string" id="i3" SOAP-ENC:root="0">foo</item> <item xsi:type="xsd:string" id="i4" SOAP-ENC:root="0">bar</item> <item xsi:type="xsd:string" id="i5" SOAP-ENC:root="0">baz</item> <item xsi:type="xsd:string" id="i6" SOAP-ENC:root="0">qux</item>
But the problem creeps in when you start dealing with references to arrays and hashes:
$arg = [foo=>bar=>baz=>'qux'] <SOAP-ENC:Array SOAP-ENC:arrayType="xsd:string[4]" xsi:type="SOAP-ENC: +Array"> <item xsi:type="xsd:string">foo</item> <item xsi:type="xsd:string">bar</item> <item xsi:type="xsd:string">baz</item> <item xsi:type="xsd:string">qux</item> </SOAP-ENC:Array> $arg = {foo=>bar=>baz=>'qux'} <s-gensym3 xsi:type="namesp1:SOAPStruct"> <foo xsi:type="xsd:string">bar</foo> <baz xsi:type="xsd:string">qux</baz> </s-gensym3>
If i recall correctly, Python's SOAP.py module handles these fine, but chokes on nested references, such as:
$arg = {foo=>{bar=>{baz=>['qux']}},bar=>[bar=>{baz=>'qux'}]} <s-gensym3 xsi:type="namesp2:SOAPStruct"> <foo xsi:type="namesp2:SOAPStruct"> <bar xsi:type="namesp2:SOAPStruct"> <baz SOAP-ENC:arrayType="xsd:string[1]" xsi:type="SOAP-ENC:Array"> <item xsi:type="xsd:string">qux</item> </baz> </bar> </foo> <bar SOAP-ENC:arrayType="xsd:ur-type[2]" xsi:type="SOAP-ENC:Array"> <item xsi:type="xsd:string">bar</item> <item xsi:type="namesp2:SOAPStruct"> <baz xsi:type="xsd:string">qux</baz> </item> </bar> </s-gensym3>
But, that was a year ago and maybe ZSI is more robust. I have no idea how Java handles such issues. My excitement about SOAP was quelled upon hearing such news reported at nodes like SOAP::Lite and Security (Phrack #58), but now that these security issues have allegedly beed fixed (see Soap::Lite Security Update - Version 0.55 Released), i think i'll start delving back into SOAP. Maybe i'll even have time to write a tutorial on Perl communicating with Java and Python if i am successful. :)

Oh, i would like to add that working with SOAP::Lite really allowed me to understand Perl Objects. Before, i always thought of objects as containers for methods and attributes. Whenever you slung an object around, it carried its methods and attributes as luggage, so to speak. I was shocked to find out that when you transfer a [Perl] object across the SOAP wire, only the attributes went with it. So, how does a client access an object's methods? It really doesn't - instead it sends a request to the server to access that method, and the server sends the results. This translates to everyday Perl OO when you sling an object reference around, you are only transfering a ref to the attributes - the methods are accessed through the symbol table, not the reference. Likewise, when you observe a Data::Dumper dump of an object. You don't see the methods, just the 'attributes'.

jeffa

L-LL-L--L-LL-L--L-LL-L--
-R--R-RR-R--R-RR-R--R-RR
B--B--B--B--B--B--B--B--
H---H---H---H---H---H---
(the triplet paradiddle with high-hat)