Soap suds:数组的不正确封送

Soap suds:数组的不正确封送,soap,suds,Soap,Suds,我尝试用python与负载平衡器(Zeus ZXTM)对话: a = client.factory.create('StringArrayArray') b = client.factory.create('StringArray') b.value = ['node01:80',] a.value = [b,] client.service.addDrainingNodes(['my pool'], a) 但我得到了以下错误: suds.WebFault:服务器引发的错误:“/usr/loc

我尝试用python与负载平衡器(Zeus ZXTM)对话:

a = client.factory.create('StringArrayArray')
b = client.factory.create('StringArray')
b.value = ['node01:80',]
a.value = [b,]
client.service.addDrainingNodes(['my pool'], a)
但我得到了以下错误:

suds.WebFault:服务器引发的错误:“/usr/local/zeus/zxtmadmin/lib/perl/zeus/ZXTM/SOAPBase.pm第772行不是数组引用

架构定义的摘录:


将每个命名池的节点添加到排放节点列表中。
我也试过这样: client.service.addDrainingNodes(['MyPool'],[['node01:80']] 在Soapy中有效,但现在在肥皂水中我得到:

suds.WebFault:服务器引发的错误:“值不是数组”

SOAPpy和suds发送内容的比较:

SOAPpy(有效):


我的游泳池
地点01:80
肥皂水(不起作用):


我的游泳池
地点01:80
背景:

  • 我不喜欢肥皂水和肥皂
  • ZXTM负载平衡器只有SOAP接口
  • 使用python2.6和suds 0.3.9
  • 我们曾经使用ZSI的SOAPpy,但在Python2.6下使用它时遇到问题

编辑:添加了sud/SOAPpy有效负载

我觉得奇怪的是,您必须显式构造“StringArrayRay”和“StringArray”之类的类型——用python这样的语言编写的足够智能的SOAP客户端应该能够通过反射、检查传递给服务调用的参数来解决这个问题。我猜它们在wsdl中被声明为类似于“SOAP-ENC:Array”的东西——如果是这样的话,它们并不打算成为对象。这对于错误消息“notarray reference”也是有意义的。你试过了吗

a = [ ['node01:80',], ]
client.service.addDrainingNodes(['my pool'], a)
或者如果失败的话

a = client.factory.create('StringArrayArray')
b = ['node01:80',]
a.value = [ b, ]
client.service.addDrainingNodes(['my pool'], a)

祝你好运。

我觉得奇怪的是,你必须显式地构造“StringArrayRay”和“StringArray”这样的类型——用python这样的语言编写的足够聪明的SOAP客户端应该能够通过反射、检查传递给服务调用的参数来解决这个问题。我猜它们在wsdl中被声明为类似于“SOAP-ENC:Array”的东西——如果是这样的话,它们并不打算成为对象。这对于错误消息“notarray reference”也是有意义的。你试过了吗

a = [ ['node01:80',], ]
client.service.addDrainingNodes(['my pool'], a)
或者如果失败的话

a = client.factory.create('StringArrayArray')
b = ['node01:80',]
a.value = [ b, ]
client.service.addDrainingNodes(['my pool'], a)
祝你好运。

试过之后

  • 这个函数有无数不同的参数
  • 来自ZSI的wsdl2py
我发现suds 4.0提供插件,通过黑客攻击解决了这个问题,但我认为这是一个suds bug:

class FixArrayPlugin(Plugin):
    def sending(self, context):
        command = context.envelope.getChild('Body').getChildren()[0].name
        if command == 'addDrainingNodes':
            context.envelope.addPrefix('xsd', 'http://www.w3.org/1999/XMLSchema')
            values = context.envelope.getChild('Body').getChild('addDrainingNodes').getChild('values')
            values.set('SOAP-ENC:arrayType', 'xsd:list[1]')
            values.set('xsi:type', 'SOAP-ENC:Array')
            item = values[0]
            item.set('SOAP-ENC:arrayType', 'xsd:list[1]')
            item.set('xsi:type', 'SOAP-ENC:Array')

client = Client(wsdl, location=location, plugins=[FixArrayPlugin()])
a = client.factory.create('StringArrayArray')
b = client.factory.create('StringArray')
b.item = ['node01:80']
a.item = [b,]
client.service.addDrainingNodes(['my pool'], a)
我期待着这个问题得到解决,在国际海事组织,这应该是一个单一的班轮 在尝试之后,我仍然对更好的选择感兴趣

  • 这个函数有无数不同的参数
  • 来自ZSI的wsdl2py
我发现suds 4.0提供插件,通过黑客攻击解决了这个问题,但我认为这是一个suds bug:

class FixArrayPlugin(Plugin):
    def sending(self, context):
        command = context.envelope.getChild('Body').getChildren()[0].name
        if command == 'addDrainingNodes':
            context.envelope.addPrefix('xsd', 'http://www.w3.org/1999/XMLSchema')
            values = context.envelope.getChild('Body').getChild('addDrainingNodes').getChild('values')
            values.set('SOAP-ENC:arrayType', 'xsd:list[1]')
            values.set('xsi:type', 'SOAP-ENC:Array')
            item = values[0]
            item.set('SOAP-ENC:arrayType', 'xsd:list[1]')
            item.set('xsi:type', 'SOAP-ENC:Array')

client = Client(wsdl, location=location, plugins=[FixArrayPlugin()])
a = client.factory.create('StringArrayArray')
b = client.factory.create('StringArray')
b.item = ['node01:80']
a.item = [b,]
client.service.addDrainingNodes(['my pool'], a)
我期待着这个问题得到解决,在国际海事组织,这应该是一个单一的班轮
我将此保留开放状态,因为我仍然对更好的替代方案感兴趣

hm,两种方法都没有成功。。事实上,sud应该能够构造复杂的类型,但在某个地方失败了,现在也打开了一张trac罚单:嗯,没有运气尝试了这两种。。事实上,SUD应该能够构造复杂类型,但在某个地方失败了,现在也打开了trac票据: