in reply to Re: Using Perl's SOAP::Lite to talk to Python
in thread Using Perl's SOAP::Lite to talk to Python
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:
Python's SOAP.py library encodes a string like so:$arg = 'Hello SOAP' <s-gensym3 xsi:type="xsd:string">Hello SOAP</s-gensym3>
Here is a Perl array (or hash):<Result xsi:type="xsd:string">Hello SOAP</Result>
Which is very similar to a Python array:@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>
But the problem creeps in when you start dealing with references to arrays and hashes:<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>
If i recall correctly, Python's SOAP.py module handles these fine, but chokes on nested references, such as:$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>
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. :)$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>
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)
|
|---|