Soap suds:数组的不正确封送
我尝试用python与负载平衡器(Zeus ZXTM)对话: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
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
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
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票据: