2010-08-19 89 views
1

我试着跟一个负载均衡器(宙斯ZXTM)与Python阵列的不正确编组:泡沫:数组

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: Server raised fault: 'Not an ARRAY reference at /usr/local/zeus/zxtmadmin/lib/perl/Zeus/ZXTM/SOAPBase.pm line 772.

提取物架构定义:

<types> 
     <xsd:schema targetNamespace='http://soap.zeus.com/zxtm/1.0/' 
      xmlns='http://www.w3.org/2001/XMLSchema' 
      xmlns:SOAP-ENC='http://schemas.xmlsoap.org/soap/encoding/' 
      xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/'> 

      <xsd:complexType name="StringArray"> 
       <xsd:complexContent> 
        <xsd:restriction base='SOAP-ENC:Array'> 
         <xsd:attribute ref='SOAP-ENC:arrayType' wsdl:arrayType='xsd:string[]'/> 
        </xsd:restriction> 
       </xsd:complexContent> 
      </xsd:complexType> 

      <xsd:complexType name="StringArrayArray"> 
       <xsd:complexContent> 
        <xsd:restriction base='SOAP-ENC:Array'> 
         <xsd:attribute ref='SOAP-ENC:arrayType' wsdl:arrayType='zeusns:StringArray[]'/> 
        </xsd:restriction> 
       </xsd:complexContent> 
      </xsd:complexType> 
     </xsd:schema> 
    </types> 

    <message name="addDrainingNodesRequest"> 
     <part name="names" type="zeusns:StringArray" /> 
     <part name="values" type="zeusns:StringArrayArray" /> 
    </message> 

    <message name="addDrainingNodesResponse"></message> 

    <portType name="PoolPort"> 

     <operation name="addDrainingNodes"> 
      <documentation> 
       Add nodes to the lists of draining nodes, for each of the named pools. 
      </documentation> 

      <input message="zeusns:addDrainingNodesRequest"/> 
      <output message="zeusns:addDrainingNodesResponse"/> 
     </operation> 
    </portType> 
</definitions> 

我也试过这样: client.service.addDrain ingNodes([ '我的池'],[ 'NODE01:80']) 这SOAPpy的,但现在在肥皂水工作,我得到:

suds.WebFault: Server raised fault: 'Value isn't an array'

之间什么SOAPpy的,什么泡发的比较:

SOAPpy的(作品):

<ns1:addDrainingNodes xmlns:ns1="http://soap.zeus.com/zxtm/1.0/Pool/" SOAP-ENC:root="1"> 
    <v1 SOAP-ENC:arrayType="xsd:string[1]" xsi:type="SOAP-ENC:Array"> 
     <item>my pool</item> 
    </v1> 
    <v2 SOAP-ENC:arrayType="xsd:list[1]" xsi:type="SOAP-ENC:Array"> 
     <item SOAP-ENC:arrayType="xsd:string[1]" xsi:type="SOAP-ENC:Array"> 
      <item>node01:80</item> 
     </item> 
    </v2> 
</ns1:addDrainingNodes> 

泡沫(不工作):

<ns4:addDrainingNodes> 
    <names xsi:type="ns0:StringArray" ns3:arrayType="ns2:string[1]"> 
     <item xsi:type="ns2:string">my pool</item> 
    </names> 
    <values xsi:type="ns0:StringArrayArray" ns3:arrayType="ns0:StringArray[1]"> 
     <item xsi:type="ns2:string">node01:80</item> 
    </values> 
</ns4:addDrainingNodes> 

语境:

  • 我是新来的肥皂水和肥皂
  • 有仅使用python2.6的和肥皂水0.3.9
  • 我们以前用的是SOAP接口的负载均衡器ZXTM
  • ZSI的SOAPpy的,但有蟒蛇下使用它的问题2.6

编辑:加肥皂水/ SOAPpy的有效载荷

回答

1

从ZSI

尝试不同的参数

  • 不计其数这个功能
  • wsdl2py后,我发现,泡4。0提供的插件,通过黑客解决了这个情况,但尽管如此,我认为这是一个错误的泡沫:

    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) 
    

    我期待着这个问题是固定的,海事组织这应该是一个内衬 我留下这个开放,因为我仍然对更好的替代品感兴趣

0

看起来很奇怪,我是你必须明确地构造类型如“StringArrayArray”和“字符串数组” - 在像Python语言一个足够聪明的SOAP客户端应该能够通过反射摸不着头脑,检查你传递参数到服务电话。我猜他们在wsdl中被声明为“SOAP-ENC:Array” - 如果是这样的话,他们不打算成为对象。这对于错误消息“不是ARRAY参考”也是有意义的。你试过了吗?

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) 

好运。

+0

嗯,没有运气试过两个..的确,泡沫应该能够构建复杂的类型,但是某处失败了,现在也打开了一个trac票:https: //fedorahosted.org/suds/ticket/340 – hansaplast 2010-08-20 11:37:37