0

我遇到了麻烦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>

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

4

1 回答 1

0

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

如果我是正确的,那么应该是我们正在谈论的 wsdl,因为所有属性minOccurs都不存在,这意味着它默认为 1 并且您不能省略元素,尽管它们是可空的。

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

于 2012-05-07T17:24:35.123 回答