【问题标题】:SOAP 1.2 python clientSOAP 1.2 python 客户端
【发布时间】:2010-03-03 11:01:19
【问题描述】:

我正在寻找一个 python SOAP 1.2 客户端,但它似乎不存在。所有现有客户端要么未维护,要么仅与 SOAP 1.1 兼容:

  • 泡沫
  • SOAPpy
  • ZSI

【问题讨论】:

  • 使用 SOAP 1.2 比 1.1 有什么优势吗?
  • 没有一个好的 AFAIK。您提到的 SOAP 客户端似乎是唯一可用的“体面”客户端。无论哪种方式......我认为你必须自己实现一些东西(也许与 lxml 结合)。
  • 我终于用 suds 解决了我的问题。它与 1.1 vs 1.2 无关,只是在声明信封时不应添加斜杠:w3.org/2003/05/soap-envelope 有效,w3.org/2003/05/soap-envelope 无效。 ASP.NET 似乎很挑剔!
  • 而且不应该使用嵌套命名空间。
  • Bluebird75 - 你是如何解决这个问题的?你使用了 Doctor 类实例吗?

标签: python soap


【解决方案1】:

尽管这个问题有一个公认的答案,但我还是想对泡沫提出一些注意事项。

我目前正在编写一些代码来与工作中的 .tel 社区托管接口,我需要一个 Python SOAP 库,而 suds 非常理想,只是它不支持 SOAP 1.2。

出于我的目的,我设法解决了这个问题,SOAP 1.1 和 SOAP 1.2 有足够多的共同点,我能够简单地修补 suds 以使用 SOAP 1.2 信封命名空间。我在这个要点中概述了我所做的事情:https://gist.github.com/858851

这里值得复制,代码如下:

from suds.client import Client
from suds.bindings import binding
import logging


USERNAME = 'username'
PASSWORD = 'password'

# Just for debugging purposes.
logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.client').setLevel(logging.DEBUG)

# Telnic's SOAP server expects a SOAP 1.2 envelope, not a SOAP 1.1 envelope
# and will complain if this hack isn't done.
binding.envns = ('SOAP-ENV', 'http://www.w3.org/2003/05/soap-envelope')
client = Client('client.wsdl',
    username=USERNAME,
    password=PASSWORD,
    headers={'Content-Type': 'application/soap+xml'})

# This will now work just fine.
client.service.someRandomMethod()

如果我有时间,我计划向 suds 提交一个补丁,以允许指定使用 SOAP 的版本,并添加足够的缺失功能以使其有用。

【讨论】:

  • 这或多或少是我们最终所做的。棘手的是 MS SOAP 服务器实现非常挑剔,在命名空间中添加或删除一个简单的“/”会产生很大的不同。正确的唯一方法是监视 MS SOAP 服务器和 MS SOAP 客户端之间的真实通信。 Suds 也有嵌套命名空间的限制,但如果你可以控制 SOAP 服务器,你也可以解决这个问题。
  • 我需要同时支持 SOAP 1.1 和 SOAP 1.2。所以我分配了一个property,它返回一个从threadlocalbinding.envns 的值。我还必须覆盖属性的__getattribute____getitem__ 方法以使属性与泡沫一起使用。如果你选择这条路线,可能最好添加很多 cmets。
  • 是的,这确实可行,但正如您所指出的那样,它非常棘手。 Suds 可以很乐意对其进行现代化改造,但鉴于它是一个 SOAP 库,我怀疑有人会很快这样做。
【解决方案2】:

只要服务的 WSDL 正确指示,zeep 库支持 SOAP 1.1 和 1.2。

WSF/Python 支持 SOAP 1.2。

简介

WSF/Python 是 WSO2 WSF/C 的 Python 语言扩展 [http://www.wso2.org/projects/wsf/c]。 该版本使您能够 使用/提供 Web 服务 REST 和 SOAP。

  • 支持 REST
  • 支持 SOAP 1.1
  • 支持 SOAP 1.2

对于downloading,您无需注册。只需点击最底部的“提交”即可。

可以在下载的存档中找到示例,例如:

LOG_DIR = '/tmp/'
LOG_LEVEL = 4
WSFC_HOME = '/opt/wso2/wsf_c'
END_POINT = 'http://localhost:9090/axis2/services/echo/echoString'

if __name__ == '__main__':
    message = """
    <ns1:echoString xmlns:ns1="http://ws.apache.org/axis2/services/echo">
        <text>Hello World!</text>
    </ns1:echoString>
    """
    try:
        client = wso2.wsf.WSClient({
            'to':END_POINT,
            'WSF_LOG_DIR':LOG_DIR,
            'WSF_LOG_LEVEL':LOG_LEVEL,
            'WSFC_HOME':WSFC_HOME,
            })

        print 'Sending: ' + message

        response = client.request(message)

        if response is not None:
            print 'Respose: ' + response + '\n'
        else:
            print 'Error occurred!'
    except wso2.wsf.WSFault, e:
        print 'Exception occurred:'
        print e

【讨论】:

  • 对不起,我还没有时间测试它。注册过程有点麻烦AFAICT
  • 哦,但您不必注册。只需按下页面最底部的灰色提交按钮 :-)
  • 最后一次提交到这个存储库至少是 2008 年 12 月 3 日。所以放弃软件也是如此......wso2.org/repos/wso2/trunk/wsf/python
  • 链接正在重定向到 wso2.com,在那里找不到对 WSF/Python 的任何引用,否决
  • WSF/Python 似乎不再可用。
【解决方案3】:

如果您真的想使用 SOAP 1.2,即使它还没有被用作标准,我认为我可以发布一个需要一些工作的答案(一切为了更大的利益:))。

我建议你使用gSOAP

gSOAP - 一个易于使用的跨平台 C/C++爱好者开发工具包 基于 XML 的 Web 服务和 XML 解析器。虽然它是众所周知的 一个 Web 服务开发工具包和 已经证明了它的良好性能, 它也可以用来创建 高性能 XML 解析器, 来自 XML 的序列化器和反序列化器 模式或 C/C++ 结构/类。我的 实验结果表明 使用 gSOAP 生成的 XML 解析器 工具包的运行速度比 DOM 或 SAX 中的 xerces-c 解析器 模式。

现在,我希望事情就这么简单。由于 gSOAP 是一个 C++ 库,因此您必须将它包装起来才能在 Python 中使用它。

包装库的一种方法是使用名为SWIG(简化包装器和接口生成器)的工具。此工具自动包装 C/C++ 库以用于高级语言,例如(您猜对了)Python。

我还建议您阅读this PDF file (from page 14),了解使用 C++ 实现 gSOAP。很有帮助。

使用这个解决方案,您可以利用一个很好的库、SOAP 1.2 和一个非常好的性能比。我想你会对结果很满意。

【讨论】:

  • 我还看不到谁和为什么投了反对票,但我认为这个答案真的很有用,所以我给了 +1。
  • 我查看了 gSOAP。您可以使用它生成 C,然后使用 ctypes 访问它,因此这是一个很有前途的解决方案,您不需要 SWIG。但是,对于我的公司来说,封闭源软件的许可成本太高了。
  • -1 原因,这不是这个问题的答案,它是一个 c 库。所以将它移植到 python 需要一些时间和经验
  • @pylover - 这是 5 年前的一个答案,如果您查看历史,这是相关的,但做您想做的 :)
【解决方案4】:

几年前我遇到过非常相似的问题,我通过使用 Jython 解决了它。

如果没有针对 Python 的 SOAP 1.2 实现,您可能会对Jython 感兴趣,它可以将您与 Java 平台无缝集成。这意味着,您可以使用任何现有的SOAP 1.2 Java classes 并将其导入到您的 Jython 程序中。您的 Jython 程序只是您的 Python 程序,但您可以导入 Java 类。

Jython 本身包含标准 Python 编程语言发行版中的几乎所有模块,但请确保您的程序不使用任何特殊的非标准 Python 库。

示例: 比如说,您已经安装了 Jython(它是免费且开源的)并且您的 Python 程序名为 myprog.py,并且您想要使用 Java 类 CLASSNAME:

1) 导入所需的 Java 类,将 import CLASSNAME 插入您的 myprog.py
2) 运行jython myprog.py

【讨论】:

  • -1 原因,这不是这个问题的答案,所以你必须安装 JRE 和其他一些东西,只是为了一个简单的 SOAP 1.2 消息
猜你喜欢
  • 2017-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多