2011-09-14 40 views
1

我正在使用ZSI 2.1並從指定'appStatusResponse'消息的wsdl文件中工作,該消息的定義如下:如何使用wsdl2py生成的複雜類型在python中發送來自Web服務的響應

出現
<xsd:complexType name="appStatusResponse"> 
    <xsd:sequence> 
     <xsd:element name="response" type="tns:webServiceResponse" minOccurs="1" maxOccurs="1" /> 
    </xsd:sequence> 
</xsd:complexType> 

和 「webServiceResponse」 如下:

<xsd:complexType name="webServiceResponse"> 
    <xsd:sequence> 
     <xsd:element name="responseCode" type="xsd:long"/> 
     <xsd:element name="responseMessage" type="xsd:string"/> 
     <xsd:element name="exceptionCode" type="xsd:long"/> 
     <xsd:element name="exceptionMessage" type="xsd:string" nillable="true" /> 
     <xsd:element name="transactionIdentifier" type="xsd:long"/> 
     <xsd:element name="traceIdentifier" type="xsd:string"/> 
     <xsd:element name="transactionTimestamp" type="xsd:dateTime" nillable="true" /> 
    </xsd:sequence> 
</xsd:complexType> 

要發送postAppStatusResponse消息,我顯然需要與webServiceResponse和appStatusResponse結構來填充它。但是,爲postAppStatusResponse消息生成的類不包含任何內容來支持此操作。 wsdl2py生成的類型文件包括appStatusResponse_Def和webServiceResponse_Def類,但我一直無法弄清楚如何使用這些來生成我需要的東西。

生成postAppStatusResponse消息看起來像這樣:

_postAppStatusResponseTypecode = Struct(pname=("http://cig.jpmchase.net/20110218/card/acq/","postAppStatusResponse"), ofwhat=[ns0.appStatusResponse_Def(pname="postAppStatusResponse", aname="_postAppStatusResponse", typed=False, encoded=None, minOccurs=1, maxOccurs=1, nillable=True)], pyclass=None, encoded="http://cig.jpmchase.net/20110218/card/acq/") 
class postAppStatusResponse: 
    typecode = _postAppStatusResponseTypecode 
    __metaclass__ = pyclass_type 
    def __init__(self, **kw): 
     """Keyword parameters: 
     postAppStatusResponse -- part postAppStatusResponse 
     """ 
     self._postAppStatusResponse = kw.get("postAppStatusResponse") 
postAppStatusResponse.typecode.pyclass = postAppStatusResponse 

在dir()postAppStatusResponse的是:

['PostAppStatusResponse', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__metaclass__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_postAppStatusResponse', 'get_element_postAppStatusResponse', 'new_postAppStatusResponse', 'set_element_postAppStatusResponse', 'typecode'] 

和DIR postAppStatusResponse._postAppStatusResponse的()爲:

['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__'] 

我使用「wsdl2py --complexType」生成了這些文件,並且已經能夠使用包含的「get_element _...」函數可以毫無困難地提取請求消息數據。我還編寫了其他ZSI Web服務,可以毫無困難地返回更簡單的消息。但是,這個......我嘗試了許多不同的方法來發送這條消息,但還沒有找到一個可行的方法。

當然ZSI的存在使這種事情更簡單嗎?任何人都可以幫助我與我在這裏失蹤的任何東西? (我試圖讓您從長xml文件和代碼清單中獲得無關數據,但當然可以根據請求提供它們。)

回答

0

我想我已經知道了;只需要創建一個匹配響應消息結構的Python類結構,將值寫入類成員,並設置response._postAppStatusResponse = myMsg,其中myMsg是新的類結構。

1

我可能有一些代碼可以幫助你。我在嘗試從WSDL生成python代碼並聯系Outlook OMS SMS Gateway時遇到了類似的問題。引用複雜類型的消息將獲得您應該調用的new_complexType構造函數。但是,如果WSDL由於某種原因沒有引用它,比如它在一次調用中被串行化爲一個字符串,它將不會自動生成新的構造函數。複雜類型仍然可以實例化。請檢查下面的代碼示例,完整的源代碼在Phonero SMS

import sys 
import uuid 
from OMSService_client import * 

loc = OMSServiceLocator() 
kw = { 'tracefile' : sys.stdout } 
port = loc.getOMSServiceSoap(**kw) 

deliverXmsMsg = DeliverXmsSoapIn() 

xmsData = ns0.xmsData_Dec().pyclass() 
xmsData.set_attribute_client('Python SMS Client 1.0') 

user = xmsData.new_user() 
user.UserId = '' 
user.Password = '' 
user.ReplyPhone = '' 
user.CustomData = '' 
xmsData.User = user 

xmsHead = xmsData.new_xmsHead() 
xmsHead.To = xmsHead.new_to() 
xmsHead.To.Recipient = [''] 
xmsHead.SourceType = 'other' 
xmsHead.RequiredService = xmsHead.new_requiredService('SMS_SENDER') 
xmsData.XmsHead = xmsHead 

xmsBody = xmsData.new_xmsBody() 
xmsBody.set_attribute_format('SMS') 
content = xmsBody.new_content('Hello, World!') 
content.set_attribute_contentType('text/plain') 
content.set_attribute_contentId(str(uuid.uuid4())) 
content.set_attribute_contentLocation('1.txt') 
xmsBody.Content.append(content) 
xmsData.XmsBody = xmsBody 

writer = ZSI.SoapWriter(envelope=0) 
deliverXmsMsg.XmsData = writer.serialize(xmsData) 

rsp = port.DeliverXms(deliverXmsMsg) 

所以你可以在這條線,你看我可以構建一個xmsData持有人這樣說:

xmsData = ns0.xmsData_Dec().pyclass() 
相關問題