我想在Python3下用Zeep (https://python-zeep.readthedocs.io/en/master/index.html)建立一个Soap连接。但是我不明白如何改变xml的头和主体!!
我想要拥有:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www...." xmlns:ns2="http://schemas....">
<SOAP-ENV:Header>
<ns2:UsernameToken>
<Username>__USERNAME__</Username>
<Password>__PASSWORD__</Password>
<Reference>__REFERENCE__</Reference>
</ns2:UsernameToken>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<ns1:requestAd/>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>我已经做到了:
"""Doc Placeholder."""
from zeep import Client
from zeep import Settings
from zeep.xsd import ComplexType
from zeep.xsd import Element
from zeep.xsd import String as xString
settings = Settings(strict=False,
xml_huge_tree=True,
extra_http_headers={'http://www....', 'http://schemas...'})
wsdl = 'https://.......?wsdl'
client = Client(wsdl=wsdl, settings=settings)
header = Element('UsernameToken', ComplexType([Element('Username', xString()),
Element('Password', xString()),
Element('Reference', xString()),
]))
header_value = header(UsernameToken={'Username': '__USERNAME__',
'Password': '__PASSWORD__',
'Reference': '__REFERENCE__'})我的错误是:
TypeError: ComplexType() got an unexpected keyword argument 'UsernameToken'.
Signature: `Username: xsd:string, Password: xsd:string, Reference: xsd:string`注意:我尝试了documentation中的所有解决方案,但都不起作用。
发布于 2019-06-25 05:21:54
当我在使用zeep时遇到同样的问题时,我使用get_type()方法在soap调用中嵌套数据。
"""index.py"""
import zeep
settings = zeep.Settings(strict=False,
xml_huge_tree=True,
extra_http_headers={'http://www....',
'http://schemas...'})
wsdl = 'https://.......?wsdl'
client = zeep.Client(wsdl=wsdl, settings=settings)
usernameTokenRef = client.get_type('ns2:UsernameToken')
usernameTokenValues = usernameTokenRef(Username='__USERNAME__',
Password='__PASSWORD__',
Reference='__REFERENCE__')
# pass args for UsernameToken into header of soap call
# using _soapheaders arg when calling a service
response = client.service.SomeService(_soapheaders={'UsernameToken':
usernameTokenValues})发布于 2020-09-06 21:50:58
在这种情况下,错误消息是非常详细的,因为只有一个Header元素的子元素您不需要指定它,Zeep将推断它。
错误消息是,当尝试呈现复杂类型时,它需要“用户名”、“密码”和“引用”,但得到的却是"UsernameToken“。
如果你删除了关键字参数"UsernameToken",你的代码就会正常工作,这里是一个工作版本,注意你需要在列表中传递头部:
headerQ = Element('Header', ComplexType([
Element('{http://test_ns.com}UsernameToken', ComplexType(
Sequence([
Element('Username', String()),
Element('Password', String()),
Element('Reference', String())
]))
)
]))
header_value = headerQ({'Username': '__USERNAME__', 'Password': '__PASSWORD__',
'Reference': '__REFERENCE__'})
client.set_default_soapheaders([header_value])这将生成以下soap标头:
<soap-env:Header>
<Header>
<ns0:UsernameToken xmlns:ns0="http://test_ns.com">
<Username>__USERNAME__</Username>
<Password>__PASSWORD__</Password>
<Reference>__REFERENCE__</Reference>
</ns0:UsernameToken>
</Header>
</soap-env:Header>https://stackoverflow.com/questions/55760506
复制相似问题