Python suds中的自定义参数属性

时间:2012-05-07 16:17:51

标签: python wsdl suds

我在使用suds时遇到了问题。

我正在尝试创建一个通用系统来调用API,一些参数被定义为具有多个属性的类。最初所有这些属性都是空的,我正在尝试传递一个字典来自动填充一些属性

例如:

from suds.client import Client

client = Client("...")
method = "getCampaignsByCriteria"
arg_repr = {"ids": [123]}
arg = client.factory.create("CampaignSearchCriteria")
for k, v in arg_repr.iteritems():
    setattr(arg, k, v)
service = client.service
args_map = {"searchCriteria": arg}
getattr(service, method)(**args_map)

生成以下内容,CampaignSearchCriteria的所有默认字段仍然存在,ids设置正确:

<SOAP-ENV:Body>
  <ns1:getCampaignsByCriteria>
     <searchCriteria xsi:type="ns1:CampaignSearchCriteria">
        <ids xsi:type="ns1:ArrayOf_xsd_long">123</ids>
        <searchString xsi:type="ns0:string"/>
        <pageNumber xsi:type="ns2:int"/>
        <pageSize xsi:type="ns2:int"/>
        <advertiserIds xsi:type="ns1:ArrayOf_xsd_long"/>
        <archiveFilter xsi:type="ns1:ActiveFilter">
           <activeOnly xsi:type="ns2:boolean"/>
           <inactiveOnly xsi:type="ns2:boolean"/>
        </archiveFilter>
        <sortOrder xsi:type="ns1:SortOrder">
           <descending xsi:type="ns2:boolean"/>
           <fieldName xsi:type="ns0:string"/>
        </sortOrder>
     </searchCriteria>
  </ns1:getCampaignsByCriteria>
</SOAP-ENV:Body>

但是,由于我只设置了ids字段,所以我希望SOAP主体只考虑非空字段,如下所示:

<SOAP-ENV:Body>
  <ns1:getCampaignsByCriteria>
     <searchCriteria xsi:type="ns1:CampaignSearchCriteria">
        <ids xsi:type="ns1:ArrayOf_xsd_long">123</ids>
     </searchCriteria>
  </ns1:getCampaignsByCriteria>
</SOAP-ENV:Body>

当您在方法中使用自定义参数时,我找不到如何选择要包含的字段。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

SOAP请求的外观取决于您的WSDL,特别是指定消息架构的数据类型定义。
因此,如果架构不允许,您不能只省略某些字段或消息将不再是有效请求。

如果我是正确的那么this应该是我们正在谈论的wsdl,因为所有属性minOccurs都不存在,这意味着它默认为1而你不能省略元素,虽然它们是可以收费的。

我的一般建议:不要过多考虑SOAP请求的外观。 SOAP是xml,因此是人类可读的,但它并不是真正被人类解释的。