在Suds Python中覆盖Soap Envelope

7
我有一台相机,正试图通过"Suds"连接它。我已经尝试发送原始XML,并发现唯一阻止XML Suds工作的是错误的Soap信封命名空间。
信封命名空间为: xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 我想将其重写为: xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" 为了在Python中添加命名空间,我尝试使用以下代码: message = Element('Element_name').addPrefix(p='SOAP-ENC', u='www.w3.org/ENC') 但是当我将SOAP-ENV添加到命名空间时,它不会被写入,因为它被硬编码到Suds绑定中。是否有一种在Suds中覆盖它的方法?
感谢任何帮助。

你遇到了什么类型的错误?能否详细说明并发布你的代码? - systempuntoout
4个回答

6

我通过在 bindings 模块中手动覆盖 suds.binding.envns 变量来避免了这个问题:

from suds.bindings import binding
binding.envns=('SOAP-ENV', 'http://www.w3.org/2003/05/soap-envelope')

从这里开始,一切都很顺利(对于我的服务来说是这样的)。

3
我已经成功解决了这个问题,SOAP信封被硬编码到bindings.py中,该文件存储在suds.egg中,它被安装在您的site-packages中。我将SOAP信封地址更改为http://www.w3.org/2003/05/soap-envelope。这与我的相机兼容。我无法找到在suds中覆盖此信封的命令,因此我将其硬编码到bindings.py中。
感谢您的帮助。

关于如何在Suds中输入头信息,请查看我的先前问题。我会发布我的代码,因为我知道文档非常少。 - chrisg

1
from suds.client import Client
from suds.plugin import MessagePlugin

WSDL_url = "my_url?wsdl"

class MyPlugin(MessagePlugin):
    def marshalled(self, context):
        #print(str(context.envelope))
        context.envelope.nsprefixes['SOAP-ENV']='myText'

client = Client(WSDL_url, plugins=[MyPlugin()])

这个答案应该被考虑。谢谢尼古拉! - ahax

1

手动更新binding.py绝对不是正确的方法。您应该能够利用ImportDoctor来覆盖默认绑定。请查看Suds网站上修复损坏的模式的文档。

另外,您使用的Python和Suds版本是什么?


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