如何指定 xsi:type zeep python
how to specify xsi:type zeep python
我正在为 python 使用 zeep SOAP 客户端,试图为某些 wsdl_address 获取一些数据。我现在有以下内容:
ambCase = {'data1':'value1',
'data2':'value2'}
client = zeep.Client(wsdl=WSDL_Address)
result = client.service.MethodName(GUID, {'CaseDto':ambCase})
其中 ambCase 是我想要发送到服务器的数据。 MethodName 方法需要 2 个参数:GUID 令牌(没问题)和具有指定 xsi:type 属性的 ambCase object(在我的例子中它应该是 'CaseAmb'),我无法获取它工作,它失败并出现错误:
zeep.exceptions.Fault: 异常 str() 失败
上面的代码产生这个 xml(headers 除外):
<soap-env:Body>
<ns0:AddCase xmlns:ns0="http://tempuri.org/">
<ns0:guid>00000000-0000-0000-0000-000000000000</ns0:guid>
<ns0:caseDto/>
</ns0:AddCase>
我对 SOAP 和 zeep 还很陌生,有人能帮忙吗?
通过反复试验,以下组合奏效了:
objectType = client.get_type('ns6:someTypeName') # someTypeName will be in xsi:type attribute
objectWrap = xsd.Element('xmlTagName',objectType) # xmlTagName - name of created xml element
objectValue = objectWrap('param1',param2,param3[0]) # putting actual data values into object
client = zeep.Client(wsdl)
result = client.service.MethodName(objectValue) # calling some method with your object(with explicitly detrmined type) as param
问题是,如果你将字典作为方法参数传递,zeep 将自己创建该对象(没有类型),如果你想确定类型 - 自己创建该对象
我正在为 python 使用 zeep SOAP 客户端,试图为某些 wsdl_address 获取一些数据。我现在有以下内容:
ambCase = {'data1':'value1',
'data2':'value2'}
client = zeep.Client(wsdl=WSDL_Address)
result = client.service.MethodName(GUID, {'CaseDto':ambCase})
其中 ambCase 是我想要发送到服务器的数据。 MethodName 方法需要 2 个参数:GUID 令牌(没问题)和具有指定 xsi:type 属性的 ambCase object(在我的例子中它应该是 'CaseAmb'),我无法获取它工作,它失败并出现错误: zeep.exceptions.Fault: 异常 str() 失败
上面的代码产生这个 xml(headers 除外):
<soap-env:Body>
<ns0:AddCase xmlns:ns0="http://tempuri.org/">
<ns0:guid>00000000-0000-0000-0000-000000000000</ns0:guid>
<ns0:caseDto/>
</ns0:AddCase>
我对 SOAP 和 zeep 还很陌生,有人能帮忙吗?
通过反复试验,以下组合奏效了:
objectType = client.get_type('ns6:someTypeName') # someTypeName will be in xsi:type attribute
objectWrap = xsd.Element('xmlTagName',objectType) # xmlTagName - name of created xml element
objectValue = objectWrap('param1',param2,param3[0]) # putting actual data values into object
client = zeep.Client(wsdl)
result = client.service.MethodName(objectValue) # calling some method with your object(with explicitly detrmined type) as param
问题是,如果你将字典作为方法参数传递,zeep 将自己创建该对象(没有类型),如果你想确定类型 - 自己创建该对象