SOAP and Python ZSI
Revision as of 15:39, 22 October 2007 by PeterHarding (talk | contribs)
See http://pywebsvcs.sourceforge.net/
Hi Folks, Is there nobody who can help me with this more or less trivial bit of code? Greetings, Sybren On Sun, Oct 14, 2007 at 11:00:10PM +0200, Sybren Stüvel wrote: > Hi folks, > > I'm trying to get some complex types to work between a very simple ZSI > SOAP server and client. So you know what I'm talking about, I've > placed the code at the bottom of this email. > > When running the server & client, I get this output on the server: > calling the only exported method 'transfer', I get this (wrapped for > email) > > $ ./zsi_server.py > transfer: > Positional: ({'dest': u'dst', 'source': u'src', 'Amount': > {'currency': u'EUR', > 'value': u'5322', > 'fractional_digits': u'2'}},) > Named: {} > localhost - - [14/Oct/2007 22:48:03] "POST / HTTP/1.1" 500 - > localhost - - [14/Oct/2007 22:48:03] "POST / HTTP/1.1" 200 - > > On the client I get the following output, again wrapped & indented for > email readability: > > _________________________________ Sun Oct 14 22:48:03 2007 REQUEST: > <SOAP-ENV:Envelope > xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" > xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" > xmlns:ZSI="http://www.zolera.com/schemas/ZSI/" > xmlns:xsd="http://www.w3.org/2001/XMLSchema" > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> > <SOAP-ENV:Header/> > <SOAP-ENV:Body> > <transfer> > <dest id="ob7d95860" xsi:type="xsd:string">dst</dest> > <source id="ob7d95820" xsi:type="xsd:string">src</source> > <Amount> > <currency xsi:type="xsd:string">EUR</currency> > <value>5322</value> > <fractional_digits>2</fractional_digits> > </Amount> > </transfer> > </SOAP-ENV:Body> > </SOAP-ENV:Envelope> > _________________________________ Sun Oct 14 22:48:03 2007 RESPONSE: > 500 > Internal Server Error > ------- > Server: ZSI/1.1 BaseHTTP/0.3 Python/2.5.1 > Date: Sun, 14 Oct 2007 20:48:03 GMT > Content-type: text/xml; charset="utf-8" > Content-Length: 701 > > <SOAP-ENV:Envelope > xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" > xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" > xmlns:ZSI="http://www.zolera.com/schemas/ZSI/" > xmlns:xsd="http://www.w3.org/2001/XMLSchema" > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> > <SOAP-ENV:Header/> > <SOAP-ENV:Body> > <SOAP-ENV:Fault> > <faultcode>SOAP-ENV:Client</faultcode> > <faultstring>Unparseable message</faultstring> > <detail> > <Eob7925758><ZSI:ParseFaultDetail> > <ZSI:string>'int' object has no attribute 'typecode'</ZSI:string> > <ZSI:trace></ZSI:trace> > </ZSI:ParseFaultDetail> > </Eob7925758> > </detail> > </SOAP-ENV:Fault> > </SOAP-ENV:Body> > </SOAP-ENV:Envelope> > > Traceback (most recent call last): > File "./zsi_client.py", line 10, in <module> > result = b.transfer(source='src', dest='dst', quantity=amount) > File "/usr/lib/python2.5/site-packages/ZSI/client.py", line 64, in __call__ > **kw) > File "/usr/lib/python2.5/site-packages/ZSI/client.py", line 171, in RPC > return self.Receive(replytype, **kw) > File "/usr/lib/python2.5/site-packages/ZSI/client.py", line 503, in Receive > return _Binding.Receive(self, replytype, **kw) > File "/usr/lib/python2.5/site-packages/ZSI/client.py", line 431, in Receive > raise FaultException(msg) > ZSI.FaultException: Unparseable message > <ZSI:ParseFaultDetail> > <ZSI:string>'int' object has no attribute 'typecode'</ZSI:string> > <ZSI:trace></ZSI:trace> > </ZSI:ParseFaultDetail> > > > There are a few things weird here. First of all, I pass the third > parameter using the name 'quantity', but it arrives named 'Amount'. > How did that happen? Second, why do I get the parameters in a single > dictionary, instead of passed as simply named parameters? And why > can't I even return an integer? > > I hope someone can help me out here, since I'm completely at a loss > how to fix this. To run my code, save the files then start "python > zsi_server.py" and then "python zsi_client.py". I've done this using > Python 2.5 and ZSI 2.0. > > Greetings, > Sybren > > -v--v--v--v--v--v--v--v--v- complextypes.py -v--v--v--v--v--v--v--v--v- > from ZSI import TC > > TC.TypeCode.typechecks = False > > class Amount(object): > def __init__(self, currency, value, fractional_digits): > '''Constructor''' > > self.currency = currency > self.value = value > self.fractional_digits = fractional_digits > > def __unicode__(self): > return '''%s %.2f''' % (self.currency, float(self)) > > def __str__(self): > return unicode(self).encode('utf-8') > > def __repr__(self): > return '''Amount('%s', %i, %i)''' % (self.currency, > self.value, self.fractional_digits) > > Amount.typecode = TC.Struct(Amount, [ > TC.String('currency'), > TC.Integer('value'), > TC.Integer('fractional_digits')], > 'Amount') > -^--^--^--^--^--^--^--^--^- complextypes.py -^--^--^--^--^--^--^--^--^- > > As you can see, the complex type isn't that complex after all. Here is > the module with the only exported function: > > -v--v--v--v--v--v--v--v--v- exported.py -v--v--v--v--v--v--v--v--v- > from complextypes import Amount > > def transfer(*args, **kwargs): > print 'transfer:' > print '\tPositional: %s' % repr(args) > print '\tNamed: %s' % repr(kwargs) > return 0 > > -^--^--^--^--^--^--^--^--^- exported.py -^--^--^--^--^--^--^--^--^- > > Here are the server and client applications: > > -v--v--v--v--v--v--v--v--v- zsi_server.py -v--v--v--v--v--v--v--v--v- > #!/usr/bin/env python > > import ZSI.dispatch > > import complextypes > import exported > > server = ZSI.dispatch.AsServer( > port=8081, > modules=[exported], > typesmodule=complextypes) > server.server_forever() > -^--^--^--^--^--^--^--^--^- zsi_server.py -^--^--^--^--^--^--^--^--^- > > -v--v--v--v--v--v--v--v--v- zsi_client.py -v--v--v--v--v--v--v--v--v- > #!/usr/bin/env python > > from ZSI.client import NamedParamBinding as NPBinding > import sys > > from complextypes import Amount > > b = NPBinding(url='http://localhost:8081/', tracefile=sys.stdout) > amount = Amount('EUR', 5322, 2) > result = b.transfer(source='src', dest='dst', quantity=amount) > > print "Result: %s" % result > -^--^--^--^--^--^--^--^--^- zsi_client.py -^--^--^--^--^--^--^--^--^- > > > ------------------------------------------------------------------------- > This SF.net email is sponsored by: Splunk Inc. > Still grepping through log files to find problems? Stop. > Now Search log events and configuration files using AJAX and a browser. > Download your FREE copy of Splunk now >> http://get.splunk.com/ > _______________________________________________ > Pywebsvcs-talk mailing list > Pywebsvcs-talk@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/pywebsvcs-talk > Also archived at http://groups.google.com/group/pywebsvcs