gpt4 book ai didi

python - 如何使用 wsdl2py 生成的复杂类型从 python 中的 Web 服务发送响应

转载 作者:太空宇宙 更新时间:2023-11-03 19:27:48 24 4
gpt4 key购买 nike

我正在使用 ZSI 2.1 并使用指定“appStatusResponse”类型的“postAppStatusResponse”消息的 wsdl 文件进行工作,该消息定义为:

<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

postAppStatusResponse 的 dir() 是:

['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']

postAppStatusResponse._postAppStatusResponse 的 dir() 是:

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

我使用“wsdl2py --complexType”生成了文件,并且能够使用包含的“get_element_...”函数毫无问题地提取请求消息数据。我还编写了其他 ZSI Web 服务,它们可以毫无问题地返回更简单的消息。但是这个...我尝试了很多不同的方法来发送此消息,但还没有找到一种有效的方法。

ZSI 的存在肯定是为了让这种事情变得更简单吗?谁能帮我解决我在这里缺少的东西吗? (我已尽力避免您从长 xml 文件和代码列表中获取无关数据,但当然可以根据要求提供它们。)

最佳答案

我可能有一些代码可以帮助你。我在尝试从 WSDL 生成 python 代码并联系 Outlook OMS SMS 网关时遇到了类似的问题。引用复杂类型的消息将获得您应该调用的 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 Holder:

xmsData = ns0.xmsData_Dec().pyclass()

关于python - 如何使用 wsdl2py 生成的复杂类型从 python 中的 Web 服务发送响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7423971/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com