【问题标题】:How do I get suds to send optional, empty elements?如何让 suds 发送可选的空元素?
【发布时间】:2014-05-12 00:35:44
【问题描述】:

我有一个 SOAP API,我正在尝试通过 suds (python) 调用一个方法:

DoSomething(ns1:DoSomethingRequest Input, )

DoSomethingRequest 看起来像这样:

    (DoSomethingRequest){
   Person = 
      (Person){
         Name = "Joe"
         Age = 32
      }
   ActionOne = None
   ActionTwo = None
   ActionThree = None
 }

在类型定义中,动作参数都是可选的。要调用特定操作,请设置 DoSomethingRequest.ActionOne = [an instance of ActionOneRequest]。这一切都很好(我可以执行ActionOne),除了我试图调用ActionThree,而ActionThreeRequest 是一个空的复杂元素。当我设置DoSomethingRequest.ActionThree = ActionThreeRequest 时,DoSomethingRequest 上的打印会给出:

    (DoSomethingRequest){
   Person = 
      (Person){
         Name = "Joe"
         Age = 32
      }
   ActionOne = None
   ActionTwo = None
   ActionThree = <empty>
 }

并且发送到服务器的 XML 不包括 ActionThree。如果我用 pdb 截取代码并添加一个空元素&lt;ActionThree&gt;&lt;/ActionThree&gt;,它可以工作。

查看代码,是否有泡沫:

类 ObjectAppender(Appender): """ 一个 L{Object} 附加器。 """ def 附加(自我,父母,内容): 对象=内容.值 如果 self.optional(content) 和footprint(object) == 0: 返回 孩子 = self.node(内容) 父级附加(子级) 对于对象中的项目: 续=内容(标签=项目[0],价值=项目[1]) Appender.append(自我,孩子,续)

def足迹(sobject): """ 获取对象的 I{虚拟足迹}。 这实际上是对分支中具有重要价值的属性的计数。 @param sobject:泡沫对象。 @type 对象:L{对象} @return:分支足迹。 @rtype:整数 """ n = 0 对于 sobject.__keylist__ 中的一个: v = getattr(sobject, a) 如果 v 为无:继续 如果是实例(v,对象): n += 足迹(v) 继续 如果 hasattr(v, '__len__'): 如果 len(v): n += 1 继续 n +=1 返回 n

我不经常使用 SOAP,所以我认为我要么不正确地使用 API,要么不正确地使用 suds。或者,服务 API 可能是非标准的。

你知道为什么会出现问题以及如何最好地解决它吗?

奇怪的是,相反的问题是关于 SO:Suds generates empty elements; how to remove them? 不幸的是,删除空元素比找出哪些元素被删除并重新添加要容易得多。

谢谢!

【问题讨论】:

    标签: python soap suds


    【解决方案1】:

    阅读规范并与专家交谈后,我没有看到任何表明 SOAP 库可以去除可选的空元素。

    github 上有一个修补版的 suds。

    【讨论】:

      【解决方案2】:

      万一其他人遇到这个问题,但没有找到答案。类似的情况也发生在我身上。我试图在 SOAP 请求中发送以下正文,

      <ns0:list><ns0:filter xsi:type="ns0:UserFilter"/></ns0:list>
      

      我的第一次尝试是,我使用suds.client.factory 创建了元素,并在没有配置任何内容的情况下发送它。这导致了以下正文,

      <ns0:list><filter/></ns0:list>
      

      接下来我尝试手动创建Element 并手动设置type 属性。这让我得到了相同的信封体。

      在挖掘了源代码之后,我发现SoapClient.send() 方法正在剥离我在sax.Document.plain() 方法中的属性。

      查看代码,我发现我可以在 suds 客户端上设置 prettyxml=True 选项,并且不会剥离属性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-09
        • 1970-01-01
        • 1970-01-01
        • 2019-08-14
        • 2017-08-20
        • 2021-10-22
        • 1970-01-01
        相关资源
        最近更新 更多