2012-08-08 57 views
1

在我的一个应用程序中,我正在使用GAE python中的SUDS WSDL(SOAP)Web服务。SUDS:在Client.service中传递数组参数方法:GAE Python

PY代码

url = 'http://203.215.51.43/Gateway/Execute?WSDL' 
client = Client(url) 
print client 

所以打印在服务器控制台

Suds (https://fedorahosted.org/suds/) version: 0.4 GA build: R699-20100913 
Service (GatewayService) tns="urn:fks:jcaps:gateway" 
    Prefixes (2) 
     ns0 = "http://fks.com/gtwy" 
     ns1 = "urn:fks:jcaps:gateway:JavaException" 
    Ports (1): 
     (Execute) 
     Methods (1): 
      redeem(xs:string SessionId, xs:string TerminalId, xs:string StoreCod 
e, xs:string CashMemoNo, xs:string CashMemoDate, xs:double InvoiceAmount, xs:str 
ing TimeStamp, xs:string CashierId, xs:string MerchantId, ns0:SPCReqDtls SPCReqD 
tls, ns0:VoucherReqDtls[] VoucherReqDtls, ns0:CardReqDtls CardReqDtls,) 
     Types (1): 
      ns1:JavaExceptionType 

其实很能通字符串,赎回方法双类型值,但不是阵列/列表类型,

result = client.service.redeem(SessionId=result['SessionId'], StoreCode='4739', TerminalId='T1081', TimeStamp='01-01-2011 01:01:00.000') 

但我不能够在这里通过VoucherReqDtls阵列

这个VoucherReqDtls的WSDL的XML代码如下,

<!--Zero or more repetitions:--> 
      <gtwy:VoucherReqDtls> 
       <gtwy:VoucherType>GV</gtwy:VoucherType> 
       <!--1 or more repetitions:--> 
       <gtwy:VoucherReq> 
        <gtwy:VoucherNo>344234242</gtwy:VoucherNo> 
       </gtwy:VoucherReq> 
       <gtwy:VoucherReq> 
        <gtwy:VoucherNo>675685858</gtwy:VoucherNo> 
       </gtwy:VoucherReq> 
      </gtwy:VoucherReqDtls> 

所以,我怎样才能通过VoucherReqDtls阵列/列表兑换方法,这里VoucherType是GV和计数凭证号可能不只一个。

回答

5

我认为这个问题是,赎回的方法,如果你目测检查WSDL,预计GatwayReq一个复杂类型可以用下面的代码来创建:

>>> it = client.factory.create('ns0:GatewayReq') 
>>> it 
(GatewayReq){ 
    SessionId = None 
    TerminalId = None 
    StoreCode = None 
    CashMemoNo = None 
    CashMemoDate = None 
    InvoiceAmount = None 
    TimeStamp = None 
    CashierId = None 
    MerchantId = None 
    SPCReqDtls = 
     (SPCReqDtls){ 
     SPCNo = None 
     SPCAmt = None 
     } 
    VoucherReqDtls[] = <empty> 
    CardReqDtls = 
     (CardReqDtls){ 
     CardType = None 
     CardReq = 
      (CardReq){ 
       CardNo = None 
       TransAmt = None 
      } 
     } 
} 

你可以添加元素到GatewayReq对象,你会anyt对象的属性,即

>>> it.SessionId = 'blahablhabalh' 
>>> it 
(GatewayReq){ 
    SessionId = "blahablhabalh" 
    # the rest removed for readability 

,那么你会调用赎回像这样的方法:

>>>> client.service.redeem(it) 

编辑

您可以创建使用下面的语法要求的类型:

entry1 = client.factory.create('ns0:GatewayReq.ns0:VoucherReqDtls') 
>>> entry1 
(VoucherReqDtls){ 
    VoucherType = None 
    VoucherReq[] = <empty> 
} 

这用来访问无顶级类型的机制,这里指定suds docs - FACTORY

那么你可以添加这对主要要求对象如下:

>>> entry1.VoucherType = 'GV' 
>>> entry1.VoucherReq.append([12,34,56]) 
>>> entry1 
(VoucherReqDtls){ 
    VoucherType = "GV" 
    VoucherReq[] = 

     12, 
     34, 
     56, 
} 
>>> entry1.VoucherReq.append(23) 
>>> entry1 
    (VoucherReqDtls){ 
     VoucherType = "GV" 
     VoucherReq[] = 

     12, 
     34, 
     56, 
     23, 
} 

>>> it.VoucherReqDtls.append(entry1) 
>>> it 
(GatewayReq){ 
    SessionId = None 
    TerminalId = None 
    StoreCode = None 
    CashMemoNo = None 
    CashMemoDate = None 
    InvoiceAmount = None 
    TimeStamp = None 
    CashierId = None 
    MerchantId = None 
    SPCReqDtls = 
     (SPCReqDtls){ 
     SPCNo = None 
     SPCAmt = None 
     } 
    VoucherReqDtls[] = 
     (VoucherReqDtls){ 
     VoucherType = "GV" 
     VoucherReq[] = 

      12, 
      34, 
      56, 
      23, 
    }, 
    CardReqDtls = 
     (CardReqDtls){ 
     CardType = None 
     CardReq = 
      (CardReq){ 
       CardNo = None 
       TransAmt = None 
      } 
     } 
    } 

此创建XML作为低于该mathches所需的语法:

<SOAP-ENV:Header/> 
    <ns0:Body> 
     <ns1:GatewayReq> 
     <ns1:SessionId> 
      <ns1:SessionId/> 
      <ns1:TerminalId/> 
      <ns1:StoreCode/> 
      <ns1:CashMemoNo/> 
      <ns1:CashMemoDate/> 
      <ns1:TimeStamp/> 
      <ns1:CashierId/> 
      <ns1:VoucherReqDtls> 
       <ns1:VoucherType>GV</ns1:VoucherType> 
       <ns1:VoucherReq>12</ns1:VoucherReq> 
       <ns1:VoucherReq>34</ns1:VoucherReq> 
       <ns1:VoucherReq>56</ns1:VoucherReq> 
       <ns1:VoucherReq>23</ns1:VoucherReq> 
      </ns1:VoucherReqDtls> 
      <ns1:VoucherReqDtls> 
       <ns1:VoucherType>GV</ns1:VoucherType> 
       <ns1:VoucherReq>12</ns1:VoucherReq> 
       <ns1:VoucherReq>34</ns1:VoucherReq> 
       <ns1:VoucherReq>56</ns1:VoucherReq> 
       <ns1:VoucherReq>23</ns1:VoucherReq> 
      </ns1:VoucherReqDtls> 
     </ns1:SessionId> 
     <ns1:TerminalId/> 
     <ns1:StoreCode/> 
     <ns1:CashMemoNo/> 
     <ns1:CashMemoDate/> 
     <ns1:TimeStamp/> 
     <ns1:CashierId/> 
     </ns1:GatewayReq> 
    </ns0:Body> 
</SOAP-ENV:Envelope> 

,或者至少是如何,我认为它应该工作

希望它有助于

+0

感谢buddy..its真正起作用罚款字符串,双重类型。&但仍然无法根据预期的xml(如任务所示)自身构建/设计** VoucherReqDtls ** list/array。 – 2012-08-08 15:05:34

+0

是啊似乎有一些类型丢失,也许WSDL在它的删除不正确?我会看看使用一些肥皂工具,看看我能做些什么 – 2012-08-08 15:08:31

+0

[this](http://203.215.51.43/Gateway/Execute?WSDL)是我的WSDL服务。 &一件事,我也通过SOAPUI进行了测试。它在那里工作的很好..只是担心兑换方法中** VoucherReqDtls **数组的确切结构。 – 2012-08-08 15:12:51