We create a proxy instance and introspect the server methods before we can call them.
In this recipe, let's interact with an Amazon S3 storage service. We have got a test URL for the web services API. An API key is necessary to do this simple task.
Listing 7.5 gives the code for searching for SOAP methods from an Amazon S3 web service, as shown:
#!/usr/bin/env python # Python Network Programming Cookbook -- Chapter - 7 # This program requires Python 2.7 or any later version # SOAPpy has discontinued its support for Python 3. # You may find more information and other potential libraries at https://stackoverflow.com/questions/7817303/what-soap-libraries-exist-for-python-3-x import SOAPpy TEST_URL = 'http://s3.amazonaws.com/ec2-downloads/2009-04-04.ec2.wsdl' def list_soap_methods(url): proxy = SOAPpy.WSDL.Proxy(url) print ('%d methods in WSDL:' % len(proxy.methods) + ' ') for key in proxy.methods.keys(): print ("Key Name: %s" %key) print ("Key Details:") for k,v in proxy.methods[key].__dict__.iteritems(): print ("%s ==> %s" %(k,v)) break if __name__ == '__main__': list_soap_methods(TEST_URL)
If you run this script, it will print the total number of available methods that support web services definition language (WSDL) and the details of one arbitrary method, as shown:
$ python 17_5_search_amazonaws_with_SOAP.py /home/faruq/env/lib/python2.7/site-packages/wstools/XMLSchema.py:1280: UserWarning: annotation is ignored warnings.warn('annotation is ignored') 43 methods in WSDL: Key Name: ReleaseAddress Key Details: encodingStyle ==> None style ==> document methodName ==> ReleaseAddress retval ==> None soapAction ==> ReleaseAddress namespace ==> None use ==> literal location ==> https://ec2.amazonaws.com/ inparams ==> [<wstools.WSDLTools.ParameterInfo instance at 0x8fb9d0c>] outheaders ==> [] inheaders ==> [] transport ==> http://schemas.xmlsoap.org/soap/http outparams ==> [<wstools.WSDLTools.ParameterInfo instance at 0x8fb9d2c>]