我正在使用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 dict中应该有如下等效结构:
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'
我已经调查过了,似乎这个错误是在结构不是所需的格式时出现的...我的意思是,就像我以前写的dict不等同于以前写的php结构,以及如果用所需类型的转换创建的新结构不是所需的结构。
在这一点上,我被卡住了,我不知道如何继续下去。任何Maven的眼睛可以看到我的错误在哪里?
顺便说一句,如果这是解决了,这也回答了问题“如何写一个制造商在Magento 1使用SOAP v2 Web服务与Python和Zeep”。问题是没有解决的任何地方。
先谢谢你。
1条答案
按热度按时间scyqe7ek1#
我已经能够通过使用以下结构来执行该函数:
我选择了一个一般性的标题,因为我的问题是关于如何将函数所需的wsdl结构转换为python dict,但这个问题解决了一个更有趣的非常特殊的问题,那就是:“如何使用Python 3和Zeep在magento soap V2 Web服务中编写制造商”。