Dictionary returns in ZSI
-
Comments:
- here.
For my day job, I am developing a SOAP server in python. I have been using ZSI as a framework, and it is very good. It will, with mod_python, allow you to build a complete application in python (and even without mod_python you can have it as a standalone process). One of the touted features is easy return of lists and dictionaries, without having to declare ComplexTypes classes.
However, it doesn’t quite work. And the not-working-bit is really odd.
If you return a dict, such as the following:
1 return {"uid":23,"gid":993,"cid":333}
Then ZSI creates a SOAP response like:
1 <uid id="1234" xsi:type="xsd:int">23</uid>
2 <gid id="5678" xsi:type="xsd:int">993</gid>
3 <cid id="0987" xsi:type="xsd:int">333</cid>
But, if you return a dictionary with values that happen to be the same, as I did with my boilerplate code:
1 return {"uid":"xsd__string",
2 "gid":"xsd__string",
3 "cid":"xsd__string"}
Then it fails. The second and any other instance of any dict key where the value has already been used by another key is empty, and the wrong type:
1 <uid id="1234" xsi:type="xsd:string">xsd__string</uid>
2 <gid href="#5678"></gid>
3 <cid href="#0987"></cid>
This can be overcome with liberal use of classes (or subclasses, since most of the time I am returning dicts or lists). It is a bit of a pain in the arse, though. I’ve filed a bug report. And stopped using ZSI. If I found this bug this fast, then I don’t want to know how many more there are. It’s just easier to convert the XML to python objects and back again, and package it up to look like a SOAP request. Which is kind of what SOAP does anyway.