在 python 中以编程方式为 SOAP 端点调用 RPC 方法

Posted

技术标签:

【中文标题】在 python 中以编程方式为 SOAP 端点调用 RPC 方法【英文标题】:Programmatically invoke RPC methods for a SOAP endpoint in python 【发布时间】:2016-08-21 19:45:58 【问题描述】:

我正在寻找一种通过 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 Python 库支持 SOAP/RPC 调用;然而他们都做了一些“魔法”,并允许这样的事情:

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

(上一个示例取自suds documentation,但基本原理相同)。这假设我提前知道方法的名称并且无法在运行时确定它。

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

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

【问题讨论】:

有什么原因你不能使用类似 suds 的东西并选择使用反射的方法(例如 getattr)?除了方法名称之外,是否还需要动态的其他东西? @Charlie 是否愿意在答案中提供一个示例?反射可能会起作用,这似乎是我宁愿避免的不必要的并发症。我知道 RPC 库旨在简化生活,但缺乏易于扩展的 Python 式、简单的库似乎很荒谬。 好的,抱歉,我没有解决方案。以我的经验,SOAP 本来就是脆弱的——你与服务建立“合同”,然后如果它发生变化,就会有一个大的瀑布过程来进行更新。 【参考方案1】:

你可以给 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))

(我是作者,如果您对此有任何疑问,请告诉我)

【讨论】:

看起来很完美。谢谢你这样做。我可以建议你把它张贴在这里wiki.python.org/moin/WebServices 喜欢,在顶部以粗体和字体大小 250pt 或其他东西:) 另外——如果我想反其道而行之,如果能看到更多的使用示例,那就太好了。将 XML 输入 zeep,它是否支持从 WSDL 生成“服务器”端的方法? 它只是一个客户端,目前不能作为服务器。我对spyne.io/docs/2.10/index.html 有很好的经验 最近的版本有什么变化吗?您发布的示例似乎不再起作用。我现在有 0.13.0 是的,改成:: client.service._binding.create_message('ConvertSpeed', 100, 'kilometersPerhour', 'milesPerhour'))

以上是关于在 python 中以编程方式为 SOAP 端点调用 RPC 方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中以编程方式增加和减少音量

在 Python 中以编程方式启动 HiveThriftServer

如何以编程方式编写端点(netPeer Tcp 绑定)

在 Python 中以编程方式检查模块可用性?

如何在 Python 中以编程方式传递密码

在 Python 中以编程方式在 Web 浏览器中打开 URL