如何使用 Python 和 ZEEP 为 SOAP 函数构建复杂的参数

问题描述 投票:0回答:1

我正在使用 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 中编写制造商”的问题。任何地方都没有解决的问题。

提前致谢。

python-3.x magento soap zeep magento-soap-api
1个回答
0
投票

我已经能够使用此结构来执行该函数:

    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 服务中编写制造商”。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.