2010-08-19 185 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