我想将“Complex”Header传递给带有zeep库的SOAP服务
这是它应该是什么样子
<soapenv:Header>
<something:myVar1>FOO</something:myVar1>
<something:myVar2>JAM</something:myVar2>
</soapenv:Header>
我想我成功地以这种方式发送标题
header = xsd.Element(
'{http://urlofthews}Header',
xsd.ComplexType([
xsd.Element(
'{http://urlofthews}myVar1',
xsd.String()),
xsd.Element(
'{http://urlofthews}myVar2',
xsd.String())
])
)
header_value = header(myVar1='FOO',myVar2='JAM')
print (header_value)
datasoap=client.service.UserRessourcesCatalog(requete,_soapheaders=[header_value])
但是我不知道如何使用XSD在我的Header中声明并传递名称空间“something”。
任何帮助?
提前谢谢。
最好的问候
如文档中所述
http://docs.python-zeep.org/en/master/headers.html
“另一种选择是传递一个lxml的Element对象。如果wsdl没有定义一个soap标头但服务器确实需要它,这通常很有用。”
这是我的情况所以我试过
try:
import xml.etree.cElementTree as ET
except ImportError:
import xml.etree.ElementTree as ET
ET.register_namespace('something', 'http://urlofthews')
headerXML = ET.Element("soapenv:Header")
var1 = ET.SubElement(headerXML, "something:myVar1")
var1.text = "FOO"
var2 = ET.SubElement(headerXML, "something:myVar2")
var2.text = "JAM"
headerDict=xmltodict.parse(ET.tostring(headerXML))
print (json.dumps(headerDict))
datasoap=client.service.UserRessourcesCatalog(requete,_soapheaders=headerDict)
但是我得到:ComplexType()得到了一个意外的关键字参数u'soapenv:Header'。签名:``
答案 0 :(得分:19)
我最近遇到了这个问题,这就是我解决它的方法。
说你有安全&#39;标题如下......
all(data[i+k] < power_threshold for k in range(0,time_threshold))
要在zeep客户端的请求中发送此标头,您需要执行以下操作:
<env:Header>
<Security>
<UsernameToken>
<Username>__USERNAME__</Username>
<Password>__PWD__</Password>
</UsernameToken>
<ServiceAccessToken>
<AccessLicenseNumber>__KEY__</AccessLicenseNumber>
</ServiceAccessToken>
</Security>
</env:Header>
答案 1 :(得分:0)
Thx Oblivion02。
我最后使用原始方法
headers = {'content-type': 'text/xml'}
body = """<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://blablabla">
<soapenv:Header>
<something:myVar1>FOO</something:myVar1>
<something:myVar2>JAM</something:myVar2>
</soapenv:Header>
<soapenv:Body>
...
</soapenv:Body>
</soapenv:Envelope>"""
response = requests.post(wsdl,data=body,headers=headers)