如何将dict转换为suds complex suds typ

2024-09-27 21:32:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用suds向soap服务器发送请求,它应该如下所示:

<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>

有没有办法只使用dict?在

我正在尝试:

^{pr2}$

生成此请求:

    <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>

因此,我们可以认为id属性在我的StringMetada中丢失。我希望只使用dict来实现这一点,因为我正在向Soap代理编写一种Rest,它从另一个调用方获取未经验证的Json(或dict)。所以它应该尽可能的动态。在

我试图建立在飞行元素(与工厂.创建)但这似乎是一个头痛。。。我希望能为元素属性传递一个特殊的关键字(''u id'、'@id'或'\'id')。。。在

我还试图声明StringMetadata,如下所示:

"metadata": {
        'StringMetadata' : [{'_id': 'user'}, 'myfile.zip']
    }

但它给了我:

    <ns2:StringMetadata id="user"/>
    <ns2:StringMetadata>myfile.zip</ns2:StringMetadata>

如果你有一个解决方案,通过应用一个猴子补丁(在飞行中)到suds类,也请放心。在

问候


Tags: orgenvidhttpexamplesoapuniquemetadata
1条回答
网友
1楼 · 发布于 2024-09-27 21:32:00

经过数小时的理解和调试,我终于让它正常工作了。我写了一个基于suds monkey补丁的解决方案。因此,我的格言应该是:

params = {
'unique_id' : uid,
"metadata": {
        'StringMetadata' : [{'_id': 'user', '_text_':'test_user'},{'_id': 'filename', '_text_': 'myfile.zip'}]
    }
 }

 caller.myMethod(**params)

'文本'是一种魔力,它将被修补程序检测到并用作节点值。suds将使用''u id'作为一个属性,每个以\开头的元素都被解释为节点属性,因此我的补丁不处理属性。在

这是补丁:

^{pr2}$

这个块可以在sud实例化之前插入,也可以存储在一个单独的脚本文件中并导入到脚本中。就我个人而言,我使用了第二种解决方案。在

请注意,关键字text是我的选择,您可以使用'\u value\'代替。应在以下行中更新:

     if item[0] == '_text_':

请随意使用这个补丁。我认为这个特性应该内置在Suds库中

谨致问候

相关问题 更多 >

    热门问题