【发布时间】: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 截取代码并添加一个空元素<ActionThree></ActionThree>,它可以工作。
查看代码,是否有泡沫:
类 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? 不幸的是,删除空元素比找出哪些元素被删除并重新添加要容易得多。
谢谢!
【问题讨论】: