python - SUDS:在 Client.service 方法中传递数组参数:GAE Python

标签 python xml soap suds

在我的一个应用程序中正在消耗 SUDS GAE python 中的 WSDL(SOAP) Web 服务。

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

实际上可以在redeem 方法中传递string, double 类型的值,但不能传递array/list 类型,

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>

那么我如何在redeem 方法中传递VoucherReqDtls 数组/列表,这里的VoucherType 是GVVoucherNo< 的计数/strong> 可以不止一个。

最佳答案

我认为问题在于,如果您目视检查 WSDL,redeem 方法需要一个复杂类型的 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

然后您将像这样调用 redeem 方法:

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

或者至少我认为它应该这样工作

希望对你有帮助

关于python - SUDS:在 Client.service 方法中传递数组参数:GAE Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11864785/

相关文章:

php - 如何在 PHP 中使用 DOMDocument 检测 XML 元素是否为空?

Magento Api错误 fatal error : Uncaught SoapFault exception: [4] Resource path is not callable

python - 使用 Python SUDS 列出 SOAP 枚举的所有可能值

SOAP - 方法参数的最佳实践

java - 缩小操作栏后,抽屉导航切换不起作用

python - Python 服务器中的多线程

python - `return` 或 `del` 的类型是什么?

python - np.uint16 与 np.uint16 不同

python - 添加 Pandas 系列列表

php - 使用php动态创建vxml