SUDS: Предаване на параметър на масив в Client.service Метод: GAE Python

В едно от моите приложения използвам SUDS WSDL(SOAP) уеб услуги в 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

XML на WSDL кодът на този VoucherReqDtls е както по-долу,

    <!--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>

И така, как мога да предам масива/списъка VoucherReqDtl в метода на осребряване, тук VoucherType е GV и броя на VoucherNo може да бъде повече от един.


person Niks Jain    schedule 08.08.2012    source източник


Отговори (1)


Мисля, че проблемът е, че методът за осребряване, ако визуално проверите 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, както бихте добавили всеки атрибут на обект, т.е.

>>> 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 както по-долу, който съответства на необходимия синтаксис:

<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>

или поне така мисля, че трябва да работи

надявам се да помогне

person olly_uk    schedule 08.08.2012
comment
благодаря, приятел.. наистина работи добре за низ, двоен тип. & но все още не съм в състояние да създам/проектирам списък/масив VoucherReqDtls според очаквания xml (както е показано в мисията). - person Niks Jain; 08.08.2012
comment
да, изглежда, че някои типове липсват, може би WSDL не е правилен в своята декларация? Ще погледна с помощта на сапун и ще видя какво мога да направя - person olly_uk; 08.08.2012
comment
това е моята WSDL услуга. И едно нещо, бях тествал и върху SOAPUI. там работи добре.. притеснявам се само за точната структура на масива VoucherReqDtls при метода за осребряване. - person Niks Jain; 08.08.2012
comment
ха, тъкмо го пробвах в SOAPui и както казваш, работи перфектно. може би това е грешка в пяната? - person olly_uk; 08.08.2012
comment
ох.. разбирам!!.. междувременно.. бихте ли ми показали грубата структура на масива на VoucherReqDtls?, за да мога да приложа в моя код. - person Niks Jain; 08.08.2012
comment
Няма проблем приятел...ОК...ако искаме да предадем прост масив, тогава как можем да предадем това програмно? - person Niks Jain; 08.08.2012
comment
comment
приятелю..ти си спасител на живота....Имам решение тук..работи страхотно.. :) благодаря много.. - person Niks Jain; 09.08.2012