【发布时间】:2016-01-20 20:11:42
【问题描述】:
我正在尝试使用如下所示的 suds 向肥皂服务器发送请求:
<SOAP-ENV:Envelope xmlns:ns0="http://example.com/wsdl/abc/model/v1" xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns2="http://example.com/xsd/abc/common/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<ns1:Body>
<ns0:myMethod>
<unique_id>5211c04b-9cf5-4368-a393-ed96d7b5489d</unique_id>
<metadata>
<ns2:StringMetadata id="user">test_user</ns2:StringMetadata>
<ns2:StringMetadata id="filename">myfile.zip</ns2:StringMetadata>
<ns2:StringMetadata id="unique_id">5211c04b-9cf5-4368-a393-ed96d7b5489d</ns2:StringMetadata>
</metadata>
</ns0:myMethod>
</ns1:Body>
有没有办法通过使用 only dict 来做到这一点?
我正在尝试这个:
params = {
'unique_id' : uid,
"metadata": {
'StringMetadata' : ['test_user', 'myfile.zip']
}
}
caller.myMethod(**params)
哪个产生了这个请求:
<SOAP-ENV:Envelope xmlns:ns0="http://example.com/wsdl/abc/model/v1" xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns2="http://example.com/xsd/abc/common/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<ns1:Body>
<ns0:myMethod>
<unique_id>2ae5a60e-7928-4d4f-9e53-bafe2a003b8a</unique_id>
<metadata>
<ns2:StringMetadata>test_user</ns2:StringMetadata>
<ns2:StringMetadata>myfile.zip</ns2:StringMetadata>
</metadata>
</ns0:myMethod>
</ns1:Body>
</SOAP-ENV:Envelope>
所以我们可以确定我的 StringMetada 中缺少 id 属性。我想使用 only dict 来完成,因为我正在编写一种 Rest to Soap 代理,它从另一个调用者那里获取一个未经验证的 Json(或 dict)。所以它应该尽可能动态。
我尝试构建动态元素(使用 factory.create),但这似乎令人头疼……我希望通过为元素属性('_id'、'@id' 或'#id')...
我也尝试像这样声明我的 StringMetadata:
"metadata": {
'StringMetadata' : [{'_id': 'user'}, 'myfile.zip']
}
但它给了我:
<ns2:StringMetadata id="user"/>
<ns2:StringMetadata>myfile.zip</ns2:StringMetadata>
如果您有解决方案,请随时将猴子补丁(即时)应用于 suds 类。
问候
【问题讨论】:
标签: python dictionary soap xmltodict