使用Python编程以编程方式调用SOAP端点的RPC方法

9

我正在寻找一种简单的方式通过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)

我知道有几个支持SOAP/RPC调用的Python库;但是它们都会进行一些“魔法”,并允许像这样的事情:

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

(前面的例子来自 suds文档 ,但基本原理相同)。这假设我预先知道方法的名称,无法在运行时确定。

寻找解决方案时,它们要么不再维护,要么试图做太多“魔术”。例如,请参见这个过于复杂的解决方案此解决方案,基本上是“构建自己的XML并发送它”。

是否有任何库可以为我构建“出站”XML,而无需通过各种困难?我已经有一个HTTP服务器,它将接收入站RPC,并希望使用requests来正确处理诸如SSL证书验证之类的事情。


你不能使用像suds这样的东西并使用反射来选择方法吗(例如getattr)?除了方法名称之外,还有其他需要动态处理的内容吗? - Charlie
@Charlie能否在答案中提供一个例子?反射可能有效,但它似乎是一种不必要的复杂性,我宁愿避免。我知道RPC库旨在简化生活,但缺乏一个符合Python风格、简单易扩展的库似乎很荒谬。 - lorenzog
好的,抱歉我没有解决方案。根据我的经验,SOAP 是脆弱的 - 你与服务建立了一个“合同”,如果它发生了变化,就需要进行大量的瀑布流程来进行更新。 - Charlie
1个回答

22

你可以尝试一下 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))

(我是作者,如果您对此有任何问题,请让我知道)


看起来很完美。感谢您的付出。我可以建议您将其发布在 https://wiki.python.org/moin/WebServices 这里,就像在顶部以粗体和250pt字体大小之类的方式 :) - lorenzog
另外,如果能看到更多的使用示例会很好,例如,如果我想做相反的事情,比如将XML馈送到zeep中,它是否支持从WSDL生成方法的“服务器”端? - lorenzog
最近的版本有什么变化吗?你发布的示例似乎不再起作用了。我目前使用的是0.13.0版本。 - lorenzog
客户端.service._binding.create_message('ConvertSpeed', 100, 'kilometersPerhour', 'milesPerhour')) 已更改。 - mvantellingen
谢谢,我已经更新了回答(需要审核,但已经存在)。 - lorenzog
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接