如何将SOAP头传递到WSDL文件中未定义的python SUD中

我的网络上有一个摄像头,我正试图用肥皂水连接它,但肥皂水并不能发送所有需要的信息。我需要在WSDL文件中添加未定义的额外soap头,以便摄像头能够理解消息。所有的头都包含在SOAP信封中,然后suds命令应该在消息体中

我已经查过肥皂水网站了
它说要像这样传入标题:(这作为标题传入元素,但我有一个信封,所以我不确定如何输入它)

来自suds.sax.element导入元素的


客户端=客户端(url)
ssnns=('ssn','http://namespaces/sessionid')
ssn=Element('SessionID',ns=ssnns).setText('123')
client.set_选项(soapheaders=ssn)
结果=client.service.addPerson(个人)

现在,我不确定我将如何实现这一点。例如,我有下面的标题:

<?xml version=“1.0”encoding=“UTF-8”?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV=”http://www.w3.org/2003/05/soap-envelope“xmlns:SOAP
附件=”http://www.w3.org/2003/05/soap-encoding"
<wsa:MessageID SOAP-ENV:mustUnderstand=“true”>urn:uuid:43268c01-f09c6&lt/wsa:MessageID>
<SOAP-ENV:标题>

使用这个或类似的示例,有人知道如何将有效的SOAP消息传递给目标服务吗

谢谢

我已经解决了如何在sud中输入新的头和名称空间。
如上所述,您创建一个元素并将其作为soapheader传入,如下所示:

来自suds.sax.element导入元素的


客户端=客户端(url)
ssnns=('ssn','http://namespaces/sessionid') 
ssn=Element('SessionID',ns=ssnns).setText('123')
client.set_选项(soapheaders=ssn)
结果=client.service.addPerson(个人)

但是,如果您想添加一个名称空间,我发现添加前缀似乎可以做到这一点。因此,当您创建一个元素时,可以添加addPrefix。我不确定这是否是计划中的方式,但它是有效的

ssn=Element('SessionID',ns=ssnns).setText('123').addPrefix(p='SOAP-ENC',u='fonthttp://www.w3.org/2003/05/soap-encoding')

p='SOAP-ENC'可以是任何前缀,例如wsau=http://address是命名空间的地址

将运行的完整脚本可以是:

#/usr/local/bin/python2.6
进口肥皂水
#导入日志记录
从suds.client导入客户端
从suds.sax.element导入元素
从suds.sax.attribute导入属性
从suds.xsd.sxbasic导入
def absoluteMove():
#连接到WSDL文件并将位置存储在变量“client”中
客户机=客户机('http://10.10.10.10/p.wsdl')
client.options.location=http://10.10.10.10:32963'
#创建标题
wsans=('wsa','http://schemas.xmlsoap.org/ws/2004/08/addressing')
mustAttribute=Attribute('SOAP-ENV:mustUnderstand','true')
n1s=('SOAP-ENC','http://www.w3.org/2003/05/soap-encoding')
msgId=Element('Element').addPrefix(p='SOAP-ENC',u='s)http://www.w3.org/2003/05/soap-encoding')
msgId2=Element('Address',ns=wsans)。setText('http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous')
msgId1=元素('ReplyTo',ns=wsans)。插入(msgId2)
msgId1.append(mustAttribute)
msgId3=Element('To',ns=wsans)。setText('http://10.10.10.10:32954')
msgId3.append(mustAttribute)
set_选项(soapheaders=[msgId,msgId1,msgId3,msgId2])
#使用“工厂”命名空间创建要作为参数传递的“令牌”对象
令牌=client.factory.create('ns4:ReferenceToken')
#创建要作为参数传递的“dest”对象和传递到此对象的值
dest=client.factory.create('ns4:PTZVector')
目的地配电盘x=1
目的地潘蒂尔_y=4.9
目标缩放。\u x=1
#创建要作为参数传递的“speed”对象和传递到此对象的值
速度=client.factory.create('ns4:PTZSpeed')
速度潘蒂尔特x=0
速度潘蒂尔特_y=0
速度。缩放。_x=1
#调用的“AbsoluteMove”方法传递在上述对象中输入的新值
尝试:
结果=client.service.AbsoluteMove(令牌、目的地、速度)
打印“绝对移动结果”,结果
返回结果
除suds.WebFault外,e:
打印“suds.WebFaults:
打印e
如果“\uuuuu name\uuuuuuu=”\uuuuuuu main\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

这会移动相机。要更改soap信封的类型,请检查我的下一个问题

您可以将日志添加到此脚本中,这样您就可以检查您发送的xml命令是否方便:

导入日志记录
logging.basicConfig(级别=logging.INFO)
logging.getLogger(’suds.client’).setLevel(logging.DEBUG)

如果位置不在wsdl文件中,则可以将该位置作为选项放入脚本中

发表评论