запросы wsdl2py - PullRequest
       10

запросы wsdl2py

2 голосов
/ 04 марта 2010

Я пытаюсь получить результаты от службы SOAP под названием Chrome ADS (для данных об автомобиле). Они предоставили примеры php и Java, но мне нужен python (наш сайт в Django). Мой вопрос:

Что я должен передавать в качестве запроса службе SOAP при использовании сгенерированных wsdl2py классов?

Следуя примерам, я использую объект DataVersionsRequest в качестве параметра запроса, но код, сгенерированный wsdl2py, похоже, хочет получить объект getDataVersions, и что-то подобное определено внизу сгенерированного файла _client.py. Но это тоже, кажется, выдает ошибку. Так что я не уверен, что я должен передать как запрос obj. Есть предложения?

$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, верны, я предполагаю, что это те строки, которые я вижу в XML, когда я исследую сервис с SOAP UI, верно

Ответы [ 2 ]

1 голос
/ 04 марта 2010

Похоже, вы могли бы передавать класс в 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, так что вы, вероятно, на правильном пути.

0 голосов
/ 04 марта 2010

Возможно, вам нужно создать экземпляры ваших объектов определения, а затем заполнить их. Найдите объекты типа == pyclass_type, связанные с запросом, который вы хотите сделать, и создайте их экземпляр.

например. (только догадываясь)

>>> versionrequest = getDataVersions()
>>> versionrequest.AccountInfo = versionrequest.new_AccountInfo()
>>> versionrequest.AccountInfo.accountNumber = "123"
>>> versionrequest.AccountInfo.accountSecret = "shhhh!"
>>> service.getDataVersions(versionrequest)

Я обнаружил, что код, сгенерированный wsdl2py, был слишком медленным для моих целей. Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...