20110922¶
ZSI¶
Ich habe daraufhin wsdl2py gefunden, das ein Teil von ZSI ist.
Hier zwei erste Beispiele (angepasst aus der Doku von ZSI)
Server:
# based on Examples in http://pywebsvcs.sourceforge.net/zsi.html
def hello():
return "Hello, world"
def echo(*args):
return args
def average(*args):
print args
sum = 0
for i in args: sum += i
return sum / len(args)
from ZSI import dispatch
dispatch.AsServer()
Client:
from ZSI.client import Binding
fp = open('debug.out', 'a')
#~ b = Binding(url='/cgi-bin/simple-test', tracefile=fp)
b = Binding(url='http://127.0.0.1', tracefile=fp)
a = b.average(range(1,11))
assert a == 5
print b.hello()
fp.close()
N.B.: die letzte releaste Version 2.0 funktioniert nicht mit neueren Python-Versionen. Aber ZSI-2.1-a1.tar.gz wohl.
One problem with the ZSI documentation is that the examples there don’t work anymore because the respective servers have disappeared or modified their service.
Through www.xmethods.net I found the countries service by www.mobilefish.com which seems to work.
wsdl2py http://www.mobilefish.com/services/web_service/countries.php?wsdl
This created ndeed the 3 files
countries_webservice_mobilefish_com_client.py
,
xxx_server.py
and
xxx_types.py
.
But even now I didn’t manage to get an example request to work.
Here is where I abandoned:
# import the generated class stubs
import countries_webservice_mobilefish_com_client as client
import countries_webservice_mobilefish_com_server as server
# get a port proxy instance
loc = client.countries_webservice_mobilefish_comServiceLocator()
#~ addr = loc.getcountries_webservice_mobilefish_comPortAddress()
port = loc.getcountries_webservice_mobilefish_comPort()
# create a new request
req = server.countryInfoByIanaRequest(ianacode='be')
#~ req.Options = req.new_Options()
#~ req.Options.Query = ’newton’
# call the remote method
resp = port.WolframSearch(req)
# print results
print ’Search Time:’, resp.Result.SearchTime
print ’Total Matches:’, resp.Result.TotalMatches
for hit in resp.Result.Matches.Item:
print ’--’, hit.Title
SOAPpy¶
I discovered that Dive Into Python has a chapter on SOAP.
Only a few minor problems:
SOAPpy caused a traceback “SyntaxError: from __future__ imports must occur at the beginning of the file” in Python 2.7, but that was easy to fix, and only 3 files were concerned.
Oops, the example in DIP is also obsolete: Google says “We are no longer issuing new API keys for the SOAP Search API.” http://code.google.com/intl/de/apis/soapsearch/api_faq.html#price1
But it wasn’t difficult to write my own script inspect_wsdl.py
:
"""
USAGE:
python inspect_wsdl.py <URL>
Where <URL> must return the WSDL of a web service. Examples:
http://www.mobilefish.com/services/web_service/countries.php?wsdl
Thanks to http://diveintopython.org/soap_web_services/"""
import sys
from SOAPpy import WSDL
def inspect(wsdl_url):
print wsdl_url
proxy = WSDL.Proxy(wsdl_url)
#~ proxy.soapproxy.config.dumpSOAPOut = 1
#~ proxy.soapproxy.config.dumpSOAPIn = 1
for k,v in proxy.methods.items():
print '%s(%s)' % (k,','.join([(p.type[1]+' '+p.name) for p in v.inparams]))
print ' --> ' + ','.join([(p.type[1]+' '+p.name) for p in v.outparams])
#~ print proxy.countryInfoByIana('be')
if __name__ == '__main__':
if len(sys.argv) <= 1:
print __doc__
sys.exit(-1)
for url in sys.argv[1:]:
inspect(url)
If I call it like this:
python inspect_wsdl.py http://www.mobilefish.com/services/web_service/countries.php?wsdl
Then the output is:
http://www.mobilefish.com/services/web_service/countries.php?wsdl
countryInfoByIana(string ianacode)
--> CountryData countryinfo
getIANAInfo()
--> IANAList ianalist
regionsInfoByIana(string ianacode)
--> RegionList regionlist
<SOAPpy.Types.structType return at 15857024>: {'countryname': 'Belgium', 'latitude': 50.503887, 'longitude': 4.469936, ' ianacode': 'be'}
Inspecting the BCSS¶
Launching inspect_wsdl.py on a BCSS server, I get only one method:
sendXML(xmlString requestXML)
--> xmlString replyXML
… which is of course not very instructive per se …
Next step will be to get the XSDs to be used for requestXML and replyXML.