Skip to main content
 首页 » 编程设计

python之wsdl2py 请求

2025年05月04日25qq78292959

我正在尝试从名为 Chrome ADS 的 SOAP 服务(用于车辆数据)中获取结果。他们提供了 php 和 Java 示例,但我需要 python(我们的站点在 Django 中)。我的问题是:

当使用 wsdl2py 生成的类时,我应该将什么作为请求传递给 SOAP 服务?

按照示例,我使用 DataVersionsRequest 对象作为请求参数,但 wsdl2py 生成的代码似乎需要一个 getDataVersions 对象,并且在生成的 _client.py 文件底部定义了类似的东西。但这似乎也会引发错误。所以我不确定我应该将什么作为请求对象传递。有什么建议吗?

$sudo apt-get install python-zsi 
$wsdl2py http://platform.chrome.com/*********** 
$python  
>>> url = "http://platform.chrome.com/***********" 
>>> from AutomotiveDescriptionService6_client import * 
>>> from AutomotiveDescriptionService6_types import * 
>>> locator = AutomotiveDescriptionService6Locator() 
>>> service = locator.getAutomotiveDescriptionService6Port() 
>>> locale = ns0.Locale_Def('locale') 
>>> locale._country="US" 
>>> locale._language="English" 
>>> acctInfo = ns0.AccountInfo_Def('accountInfo') 
>>> acctInfo._accountNumber=***** 
>>> acctInfo._accountSecret="*****" 
>>> acctInfo._locale = locale 
>>> dataVersionsRequest = ns0.DataVersionsRequest_Dec() 
>>> dataVersionsRequest._accountInfo = acctInfo 
>>> service.getDataVersions(dataVersionsRequest) 
Traceback (most recent call last): 
  File "<stdin>", line 1, in <module> 
  File "AutomotiveDescriptionService6_client.py", line 36, in getDataVersions 
    raise TypeError, "%s incorrect request type" % (request.__class__) 
TypeError: <class 'AutomotiveDescriptionService6_types.DataVersionsRequest_Dec'> incorrect request type 
>>> dataVersionsRequest = getDataVersions 
>>> dataVersionsRequest._accountInfo = acctInfo 
>>> service.getDataVersions(dataVersionsRequest) 
Traceback (most recent call last): 
  File "<stdin>", line 1, in <module> 
  File "AutomotiveDescriptionService6_client.py", line 36, in getDataVersions 
    raise TypeError, "%s incorrect request type" % (request.__class__) 
AttributeError: class DataVersionsRequest_Holder has no attribute '__class__' 
>>> quit() 
$cat AutomotiveDescriptionService6_client.py 
..... 
# Locator 
class AutomotiveDescriptionService6Locator: 
    AutomotiveDescriptionService6Port_address = "http://platform.chrome.com:80/AutomotiveDescriptionService/AutomotiveDescriptionService6" 
    def getAutomotiveDescriptionService6PortAddress(self): 
        return AutomotiveDescriptionService6Locator.AutomotiveDescriptionService6Port_address 
    def getAutomotiveDescriptionService6Port(self, url=None, **kw): 
        return AutomotiveDescriptionService6BindingSOAP(url or AutomotiveDescriptionService6Locator.AutomotiveDescriptionService6Port_address, **kw) 
 
# Methods 
class AutomotiveDescriptionService6BindingSOAP: 
    def __init__(self, url, **kw): 
        kw.setdefault("readerclass", None) 
        kw.setdefault("writerclass", None) 
        # no resource properties 
        self.binding = client.Binding(url=url, **kw) 
        # no ws-addressing 
 
    # op: getDataVersions 
    def getDataVersions(self, request, **kw): 
        if isinstance(request, getDataVersions) is False: 
            raise TypeError, "%s incorrect request type" % (request.__class__) 
        # no input wsaction 
        self.binding.Send(None, None, request, soapaction="", **kw) 
        # no output wsaction 
        response = self.binding.Receive(getDataVersionsResponse.typecode) 
        return response 
..... 
getDataVersions = GED("urn:description6.kp.chrome.com", "DataVersionsRequest").pyclass 

另外,顺便说一句,我不确定传递给 pname 参数的字符串是否正确,我假设这些是我在使用 SOAP UI 探索服务时在 XML 中看到的字符串,对吧?

请您参考如下方法:

看起来您可能第二次将类传递给 service.getDataVersions() 而不是实例(如果没有 __class__ 就不能是实例)。

发生的事情是 isinstance() 返回 false,并且在尝试引发类型错误的过程中,反而引发了属性错误,因为它试图访问显然不存在的 __class__。

如果你尝试会发生什么:

>>> dataVersionsRequest = getDataVersions**()** 
>>> dataVersionsRequest._accountInfo = acctInfo 
>>> service.getDataVersions(dataVersionsRequest) 

?

基于行:

if isinstance(request, getDataVersions) is False: 
            raise TypeError, "%s incorrect request type" % (request.__class__) 

看起来您确实应该传递一个 getDataVersions 实例,所以您可能走在正确的轨道上。