magento 如何使用Python和Zeep为SOAP函数构建复杂参数

dm7nw8vv  于 2022-11-12  发布在  Python
关注(0)|答案(1)|浏览(158)

我正在使用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”。问题是没有解决的任何地方。
先谢谢你。

scyqe7ek

scyqe7ek1#

我已经能够通过使用以下结构来执行该函数:

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 dict,但这个问题解决了一个更有趣的非常特殊的问题,那就是:“如何使用Python 3和Zeep在magento soap V2 Web服务中编写制造商”。

相关问题