【问题标题】:Custom argument attributes in Python sudsPython suds 中的自定义参数属性
【发布时间】:2012-05-07 16:17:50
【问题描述】:

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>

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

【问题讨论】:

    标签: python wsdl suds


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,我只是想这样做,因为如果 SOAP 请求中有空字段,相关的 API 会抛出错误。我发现自从 suds 0.3.8+ 起,您可以传递属性/值字典,这将生成没有空字段的适当请求。你对 wsdl 是正确的。感谢您的帮助!
    猜你喜欢
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 2017-02-07
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多