SOAP 1.2 Python客户端

14

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

  • suds
  • SOAPpy
  • ZSI

3
SOAP 1.2相较于1.1有什么优势吗? - Justin Ethier
据我所知,没有一个很好的选择。你提到的SOAP客户端似乎是唯一“像样”的可用选项。无论如何...我认为你需要自己实现一些东西(也许结合lxml)。 - Wolph
我最终使用suds解决了我的问题。这与1.1与1.2无关,只是在声明envelope时不应添加尾随斜杠:http://www.w3.org/2003/05/soap-envelope有效,而http://www.w3.org/2003/05/soap-envelope/无效。ASP.NET似乎非常挑剔! - Philippe F
同时,也不应该使用嵌套的命名空间。 - Philippe F
Bluebird75 - 你是怎么解决这个问题的?你使用了一个Doctor类实例吗? - Doug Harris
4个回答

12
尽管这个问题有一个被接受的答案,但是我想提供一些关于suds的注意事项。
我目前正在编写与.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版本,并添加足够的缺失功能,使其变得更加实用。

1
这大致就是我们最终所做的。棘手的问题在于MS SOAP服务器实现非常挑剔,添加或删除命名空间中的一个简单“/”符号可能会产生很大的差异。唯一正确的方法是窥探MS SOAP服务器和MS SOAP客户端之间的真实通信。Suds在嵌套命名空间方面也有限制,但如果您对SOAP服务器有控制权,也可以解决这个问题。 - Philippe F
我需要同时支持SOAP 1.1和SOAP 1.2。因此,我分配了一个property,它从threadlocal返回一个值到binding.envns。我还必须重写property__getattribute____getitem__方法,以使该属性与suds一起工作。如果您选择这条路线,最好添加大量注释。 - Lindlof
是的,那确实可以工作,尽管它非常棘手,正如你所指出的那样。Suds需要很多关注来现代化,但考虑到它是一个SOAP库,我怀疑任何人都不会在短时间内这样做。 - Keith Gaughan

9

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

WSF/Python支持SOAP 1.2。

介绍

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

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

下载时,无需注册。只需在底部点击“提交”即可。

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

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


抱歉,我还没有时间测试它。据我所知,注册过程有点繁琐。 - Philippe F
哦,但您不必注册。只需按页面底部的灰色“提交”按钮即可 :-) - Phil Rykoff
这个代码库的最后一次提交是在2008年12月3日,因此也被认为是废弃软件... https://wso2.org/repos/wso2/trunk/wsf/python/ - dsvensson
2
链接重定向到wso2.com,无法找到WSF/Python的任何参考资料,我要downvote。 - Erbureth
“WSF/Python” 似乎不再可用。 - Hannu

5
如果你真的想使用SOAP 1.2,即使它还没有作为标准使用,我认为我可以发布一个需要一些工作的答案(都是为了更好的目的:))。
我建议你使用gSOAP
gSOAP - 一个易于使用的跨平台工具包,用于开发基于XML的Web服务和XML解析器。虽然它以Web服务开发工具包而闻名,并已证明其良好性能,但也可以用于从XML模式或C / C ++结构/类创建高性能的XML解析器,序列化程序和反序列化程序。我的实验结果表明,使用gSOAP工具包生成的XML解析器在DOM或SAX模式下运行比xerces-c解析器快数倍。
现在,我希望它很容易。由于gSOAP是一个C ++库,因此您将不得不将其包装以便在Python中使用。

包装库的一种方法是使用一个名为SWIG(Simplified Wrapper and Interface Generator)的工具。这个工具可以自动地将C/C++库包装成高级语言(例如Python)可用的形式。

我还建议您阅读此PDF文件(从第14页开始),以了解如何在C++中实现gSOAP。它非常有帮助。

使用这个解决方案,您可以利用一个经过良好维护的库、SOAP 1.2和非常不错的性能比率。我相信您会对结果感到非常满意。


我还看不到是谁以及为什么投了反对票,但我会给这个答案一个+1,因为我认为它非常有用。 - rytis
我看了一下gSOAP。你可以用它生成C代码,然后使用ctypes访问它,这是一个很有前途的解决方案,而且不需要SWIG。然而,对于闭源软件的许可费用对于我们公司来说太昂贵了。 - Philippe F
-1 的原因是,这不是对这个问题的回答,它是一个 C 库。因此,将其移植到 Python 需要一些时间和经验。 - pylover
@pylover - 这是5年前的答案,如果你看看历史记录,它还是相关的,但你可以随意处理 :) - Kyle Rosendo

1

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

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

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

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

1)在myprog.py中插入所需的Java类导入import CLASSNAME
2)运行jython myprog.py


-1 的原因是,这不是对这个问题的回答,所以你需要安装 JRE 和其他一些东西,仅仅为了一个简单的 SOAP 1.2 消息。 - pylover

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