2016-04-27 55 views
3

我正在寻找一种通过Python以编程方式调用SOAP/RPC调用的简单方法。例如:以编程方式为Python中的SOAP端点调用RPC方法

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

我知道有several支持SOAP/RPC调用的Python库;然而,他们都做了一些“神奇”,让喜欢的事情:(从suds documentation采取了前面的例子,但基本原理都是一样的)

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

。这假设我提前知道方法的名称,并且无法在运行时确定它。

寻找解决方案,他们不再维护,或尝试做太多“魔术”。例如,请参阅this over-complicated soutionthis solution,这基本上是“构建您自己的XML并将其发送”。

是否有任何库可以为我构建“出站”XML,而不必经过这些环节?我已经有了一个HTTP服务器,它将接收入站RPC并希望使用requests正确处理SSL证书验证等事情。

+0

是有一个原因,你可以不使用泡沫之类的东西,并选择使用反射的方法(如getattr)?除了方法名称之外,还有其他需要动态的东西吗? – Charlie

+0

@Charlie照顾在答案中提供一个例子吗?反思可能会起作用,这似乎是我宁愿避免的不必要的复杂情况。我了解RPC库旨在简化生活,但缺乏易于扩展的pythonic,简单的似乎很荒谬。 – lorenzog

+0

好的抱歉,我没有解决方案。根据我的经验,SOAP意味着变得脆弱 - 您与服务建立“契约”,然后如果它发生变化,那么会有一个大瀑布进程来进行更新。 – Charlie

回答

6

你可以给python-zeep一个机会(http://docs.python-zeep.org)。它可以很容易地产生要通过下面的代码来发送XML:

client = zeep.Client(
    wsdl='http://www.webservicex.net/ConvertSpeed.asmx?WSDL') 
doc = client.service._binding.create_message('ConvertSpeed', 100, 
     'kilometersPerhour', 'milesPerhour'))  
print(etree.tostring(doc, pretty_print=True)) 

(我是作者,所以让我知道如果你有任何问题与此)

+0

看起来很完美。感谢你这样做。我可以推荐你把它发布在这里https://wiki.python.org/moin/WebServices就像在顶部的粗体和字体大小250pt或东西:) – lorenzog

+0

另外 - 这将是很高兴看到一些更多的例子使用,如 - 如果我想做相反的例如将XML提供给zeep,它是否支持来自WSDL的“服务器端”方法生成? – lorenzog

+0

这只是一个客户端,目前不能作为服务器运行。我对http://spyne.io/docs/2.10/index.html有很好的经验 – mvantellingen