使用Zeep在Python3中修改SOAP头与请求体遇TypeError问题求助
解决Zeep构建自定义SOAP Header时的TypeError问题
我帮你搞定这个问题,咱们一步步拆解错误原因并修正:
首先,触发TypeError的核心问题是:你定义的ComplexType已经直接包含了Username、Password、Reference三个元素,调用header()时不需要再套一层UsernameToken关键字参数。除此之外,还有命名空间指定、HTTP头配置的细节需要调整,下面是完整的修正方案:
步骤1:修正Settings配置
你原来的extra_http_headers用了集合且放的是XML命名空间,这是错误的。extra_http_headers用于设置HTTP请求头(比如Authorization、Content-Type),XML命名空间要在定义SOAP元素时单独指定:
from zeep import Client, Settings from zeep.xsd import ComplexType, Element, String as xString # 正确的Settings配置:关闭严格模式以兼容松散WSDL,开启大XML支持 settings = Settings(strict=False, xml_huge_tree=True)
步骤2:定义带命名空间的SOAP Header
原XML里的UsernameToken属于ns2命名空间,创建Element时必须用ns参数绑定这个命名空间:
# 替换成你实际的ns2命名空间地址 NS2 = "http://schemas...." # 定义UsernameToken的复杂数据类型 username_token_type = ComplexType([ Element('Username', xString()), Element('Password', xString()), Element('Reference', xString()), ]) # 创建带ns2命名空间的Header元素 header = Element('UsernameToken', username_token_type, ns=NS2)
步骤3:生成正确的Header值
直接传递Username、Password、Reference三个参数即可,不需要嵌套UsernameToken键:
header_value = header( Username='__USERNAME__', Password='__PASSWORD__', Reference='__REFERENCE__' )
步骤4:发起SOAP请求并附加Header
调用服务方法时,通过_soapheaders参数把自定义Header传入:
wsdl = 'https://.......?wsdl' client = Client(wsdl=wsdl, settings=settings) # 调用requestAd方法并带上自定义SOAP Header response = client.service.requestAd(_soapheaders=[header_value])
验证生成的XML结构
这样配置后,Zeep生成的SOAP请求会完全匹配你期望的结构:
return (<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> )
内容的提问来源于stack exchange,提问作者Toni Garcia
相关产品推荐
相关产品推荐

