lorenzog lorenzog - 1 year ago 137
Python Question

Programmatically invoke RPC methods for a SOAP endpoint in python

I'm looking for a simple way to programmatically invoke a SOAP/RPC call via Python. Something like:

method_to_invoke, args = parse_user_input()
outbound_xml = library.call_remote_method(method_to_invoke, args)
result = requests.post(... data=outbound_xml)

I know there are several Python libraries that support SOAP/RPC calls; however they all do some "magic" and allow for things like:

result = client.service.getPercentBodyFat('jeff', 68, 170)

(previous example taken from suds documentation but the basic principles are the same). This assumes I know the name of the method ahead of time and can't determine it at runtime.

Looking for solutions they are either no longer maintained, or try to do too much "magic". For example see this over-complicated soution or this solution which is basically "Build your own XML and send it over".

Is there any library that can build the "outbound" XML for me without having to go through hoops? I already have a HTTP server which would receive the inbound RPC and want to use
to properly handle things like SSL certificate validation.

mvt mvt
Answer Source

You can give python-zeep a chance (http://docs.python-zeep.org). It can easily generate the xml which you want to send via the following code:

client = zeep.Client(
doc = client.service._binding.create_message('ConvertSpeed', 100, 
      'kilometersPerhour', 'milesPerhour'))    
print(etree.tostring(doc, pretty_print=True))

(I'm the author so let me know if you have any issues with this)

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download