簡體   English   中英

如何將dict轉換為suds復雜的suds類型

[英]How to convert dict to suds complex suds type

我正在嘗試使用肥皂水將請求發送到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來做到這一點?

我正在嘗試:

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屬性。 我想用字典來做到這一點,因為我寫了一種休息的肥皂代理,這是從另一個呼叫者得到一個未經驗證的JSON(或字典)。 因此,它應該盡可能地動態。

我試圖建立動態元素(使用factory.create),但這似乎令人頭疼...我希望通過為元素屬性傳遞特殊關鍵字('_id','@ id'或'#id' “)...

我也試圖這樣聲明我的StringMetadata:

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

但是它給了我:

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

如果您有解決方案,請將猴子補丁(動態地)應用於suds類,也請放心。

問候

經過數小時的肥皂泡沫理解和調試,我終於設法使其工作。 我寫了一個基於泡沫猴子補丁的解決方案。 因此,我的格言應該是:

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

 caller.myMethod(**params)

' _text_ '是一種魔術,它將被補丁檢測並用作節點值。 suds將使用' _id '作為屬性,以_開頭的每個元素都被解釋為節點屬性,因此我的補丁不處理屬性。

這是補丁:

import functools
from suds.mx.appender import *
legacy_append = suds.mx.appender.ObjectAppender.append
@functools.wraps(legacy_append)
def _patch_object_append(self, parent, content):
    object = content.value
    if self.optional(content) and footprint(object) == 0:
        return
    child = self.node(content)
    for item in object:
         cont = Content(tag=item[0], value=item[1])
         if item[0] == '_text_':
            child.setText(item[1])
            continue

         Appender.append(self, child, cont)
    parent.append(child)

suds.mx.appender.ObjectAppender.append= _patch_object_append

可以在實例化suds之前插入此塊,也可以將其存儲在單獨的腳本文件中並導入到腳本中。 我個人使用第二種解決方案。

另請注意,關鍵字文本是我的選擇,您可以改用' _value_ '。 它應該在這一行中更新:

     if item[0] == '_text_':

請隨時使用此補丁。 我認為此功能應該內置在Suds庫中

問候,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM