如何使用wsdl2py生成的复杂类型在python中发送来自Web服务的响应
我正在使用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文件和代码清单中获得无关数据,但当然可以根据请求提供它们。)
我想我已经知道了;只需要创建一个匹配响应消息结构的Python类结构,将值写入类成员,并设置response._postAppStatusResponse = myMsg,其中myMsg是新的类结构。
我可能有一些代码可以帮助你。我在尝试从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()