SOAP 1.2 Python 客户端
我在找一个支持SOAP 1.2的Python客户端,但好像没有这样的东西。现在有的客户端要么不再维护,要么只支持SOAP 1.1:
- suds
- SOAPpy
- ZSI
4 个回答
如果你真的想用SOAP 1.2,尽管它还不是一个标准,我想我可以分享一个需要一些工作的解决方案(都是为了更好的结果 :)
)。
我推荐你使用gSOAP:
gSOAP是一个简单易用的跨平台工具包,专为C/C++爱好者开发XML基础的网络服务和XML解析器。虽然它被广泛认为是一个网络服务开发工具包,并且已经证明了它的良好性能,但它也可以用来创建高性能的XML解析器、序列化器和反序列化器,这些都可以从XML模式或C/C++结构/类中生成。我的实验结果表明,使用gSOAP工具包生成的XML解析器在DOM或SAX模式下的运行速度比xerces-c解析器快好几倍。
现在,我希望事情能这么简单。由于gSOAP是一个C++库,你需要对它进行封装才能在Python中使用。
封装这个库的一种方法是使用一个叫SWIG的工具(简化封装和接口生成器)。这个工具可以自动将C/C++库封装起来,以便在高级语言中使用,比如(你猜对了)Python。
我还建议你阅读这份PDF文件(从第14页开始),了解如何用C++实现gSOAP。这非常有帮助。
通过这个解决方案,你可以利用一个维护良好的库、SOAP 1.2,以及非常不错的性能。我觉得你会对结果感到满意。
虽然这个问题已经有了被接受的答案,但我想对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,并添加足够的缺失功能,使其更有用。
zeep这个库支持SOAP 1.1和1.2,只要服务的WSDL文件正确指明了这一点。
WSF/Python支持SOAP 1.2。
介绍
WSF/Python是Python语言对WSO2 WSF/C的扩展 [http://www.wso2.org/projects/wsf/c]。 这个版本让你可以使用REST和SOAP两种方式来 消费或提供网络服务。
- 支持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