我正在使用 Python3.7 和 zeep 连接到 SOAP v2 Web 服务。创建对象的一次调用需要将复杂的结构作为参数传递。这是调用的 WSDL 及其参数:
<message name="catalogProductAttributeAddOptionRequest">
<part name="sessionId" type="xsd:string"/>
<part name="attribute" type="xsd:string"/>
<part name="data" type="typens:catalogProductAttributeOptionEntityToAdd"/>
</message>
<complexType name="catalogProductAttributeOptionEntityToAdd">
<all>
<element name="label" type="typens:catalogProductAttributeOptionLabelArray"/>
<element name="order" type="xsd:int"/>
<element name="is_default" type="xsd:int"/>
</all>
</complexType>
<complexType name="catalogProductAttributeOptionLabelArray">
<complexContent>
<restriction base="soapenc:Array">
<attribute ref="soapenc:arrayType" wsdl:arrayType="typens:catalogProductAttributeOptionLabelEntity[]"/>
</restriction>
</complexContent>
</complexType>
<complexType name="catalogProductAttributeOptionLabelEntity">
<all>
<element name="store_id" type="typens:ArrayOfString"/>
<element name="value" type="xsd:string"/>
</all>
</complexType>
我遇到的问题是如何使用 zeep 将“data”参数传递给 Python 3 中的函数。我有一个关于如何在 php 中执行此操作的示例:
$label = array (
array(
"store_id" => array("0"),
"value" => "some random data"
)
);
$data = array(
"label" => $label,
"order" => "10",
"is_default" => "1"
);
$orders = $client->catalogProductAttributeAddOption($session, $attributeCode, $data);
这段代码应该可以工作,尽管我还没有测试过。因此,$data 结构在 python 字典中应该具有与此等效的结构:
data=[
{
"label": [
[
{
"store_id":["0"],
"value":"some random data"
}
]
],
"order":10,
"is_default":1
}
]
我这样调用该函数:
client.service.catalogProductAttributeAddOption(sessionId=sessionid,attribute="manufacturer",data=data)
如果我这样做,我会收到此异常:
TypeError: Any element received object of type 'list', expected lxml.etree._Element or builtins.dict or zeep.objects.catalogProductAttributeOptionLabelEntity
See http://docs.python-zeep.org/en/master/datastructures.html#any-objects for more information
因此,我开始研究 Any 元素,并发现了一种将结构的各个部分转换为 wsdl 命名空间中的类型的方法,因此我这样做:
entity={
"store_id":["0"],
"value":"some random data"
}
catalogProductAttributeOptionLabelEntity=client.get_type('ns0:catalogProductAttributeOptionLabelEntity')
retyped_entity=catalogProductAttributeOptionLabelEntity(entity)
label=[
retyped_entity
]
catalogProductAttributeOptionLabelArray = client.get_type('ns0:catalogProductAttributeOptionLabelArray')
retyped_label=catalogProductAttributeOptionLabelArray(label)
data=[
{
"label": retyped_label,
"order":10,
"is_default":1
}
]
catalogProductAttributeOptionEntityToAdd=client.get_type('ns0:catalogProductAttributeOptionEntityToAdd')
retyped_data=catalogProductAttributeOptionEntityToAdd(data)
client.service.catalogProductAttributeAddOption(sessionId=sessionid,attribute="manufacturer",data=retyped_data)
然后,我得到了这个错误:
ValidationError: 'Missing element for Any'
我已经调查过,似乎当结构不符合所需的格式时就会出现此错误...我的意思是,就像我之前写的字典不等于之前写的 php 结构,并且如果新的使用所需类型的铸件创建的结构不符合所需的结构。
此时我陷入困境,不知道如何继续。任何专家都能看出我的错误在哪里吗?
顺便说一句,如果这个问题得到解决,这也回答了“如何使用带有 Python 和 Zeep 的 SOAP v2 Web 服务在 Magento 1 中编写制造商”的问题。任何地方都没有解决的问题。
提前致谢。
我已经能够使用此结构来执行该函数:
ArrayOfString=client.get_type('ns0:ArrayOfString')
data=[
{
"label":[{
"store_id":ArrayOfString(["0"]),
"value":"some random data"
}],
"order":"10",
"is_default":"1"
}
]
client.service.catalogProductAttributeAddOption(sessionId=sessionid,attribute="manufacturer",data=data)
我选择了一个一般性的标题,因为我的问题是试图找出如何将函数所需的 wsdl 结构转换为 python 字典,但是这个问题解决了一个非常特殊的问题,更有趣,那就是:“如何使用 Python 3 和 zeep 在 magento soap V2 Web 服务中编写制造商”。