Проблема доступа к WSDL-сервису с помощью python suds поднимает TypeNotFound: ArrayOfint - PullRequest
2 голосов
/ 21 сентября 2010

Тип не найден: '(ArrayOfint, http://schemas.microsoft.com/2003/10/Serialization/Arrays,)' - это то, что вызывает средство разрешения конфликтов.В ... 2003/10 / Serialization / Arrays ArrayOfInt определен, так что, я думаю, проблема в чувствительности к регистру в linux.Любая идея, как я могу обойти это?

from suds.client import Client
c = Client("https://developer-api.affili.net/V2.0/Logon.svc?wsdl")

раньше возвращался

Type not found: '(ArrayOfint, http://schemas.microsoft.com/2003/10/Serialization/Arrays, )'

сейчас, так как через несколько дней я даже больше туда не попадаю, но вместо этого я получаю

TypeNotFound: Type not found: '(Logon, http://affilinet.framework.webservices/types, )'

1 Ответ

6 голосов
/ 21 сентября 2010

Похоже, у вас сломан WSDL.Здесь вам необходимо использовать ImportDoctor, предоставленный SUDS.Вы должны использовать это, чтобы помочь конструктору Client использовать тип ArrayOfint, найденный в http://schemas.microsoft.com/2003/10/Serialization/Arrays.

В прошлом я делал это с другими службами, но не видя ваш WSDL или ваш код, это только мое лучшее предположение о том, как вы можете это исправить, потому что я сам не могу его проверить:

from suds.client import Client
from suds.xsd.doctor import Import, ImportDoctor

# Obviously I made this up    
wsdl_url = 'http://whatever/path/to/wsdl'

# Fix missing types with ImportDoctor
schema_url = 'http://schemas.microsoft.com/2003/10/Serialization/Arrays'
schema_import = Import(schema_url)
schema_doctor = ImportDoctor(schema_import)

# Pass doctor to Client
client = Client(url=wsdl_url, doctor=schema_doctor)

Стоит отметить, что URL http://schemas.microsoft.com/2003/10/Serialization/Arrays даже недействителен (он возвращает 404), поэтому я действительно не уверен, что это правильный URL.Хотя я уверен, что по крайней мере направляю вас в правильном направлении.

Отредактируйте в ответ на ваш недавний комментарий (2010-10-05):

ИспользованиеURL, который вы указали https://developer-api.affili.net/V2.0/Logon.svc?wsdl Мне удалось успешно создать клиента.Мне пришлось использовать ImportDoctor, потому что он вызвал следующую ошибку:

TypeNotFound: Type not found: '(Logon, http://affilinet.framework.webservices/types, )'

Поэтому я использовал следующий код и смог получить успешный объект клиента:

from suds.client import Client
from suds.xsd.doctor import Import, ImportDoctor

wsdl_url = 'https://developer-api.affili.net/V2.0/Logon.svc?wsdl'

schema_url = 'http://affilinet.framework.webservices/types'
schema_import = Import(schema_url)
schema_doctor = ImportDoctor(schema_import)

client = Client(url=wsdl_url, doctor=schema_doctor)

Печатьобъект клиента отображает это:

Suds (https://fedorahosted.org/suds/) версия: 0.3.9 GA build: R659-20100219

Service ( Authentication ) tns="http://affilinet.framework.webservices/Svc"
   Prefixes (5)
      ns0 = "http://affilinet.framework.webservices/types"
      ns1 = "http://schemas.datacontract.org/2004/07/Microsoft.Practices.EnterpriseLibrary.Validation.Integration.WCF"
      ns2 = "http://schemas.microsoft.com/2003/10/Serialization/"
      ns3 = "http://schemas.microsoft.com/2003/10/Serialization/Arrays"
      ns4 = "http://www.microsoft.com/practices/EnterpriseLibrary/2007/01/wcf/validation"
   Ports (1):
      (DefaultEndpointLogon)
         Methods (2):
            GetIdentifierExpiration(xs:string CredentialToken, )
            Logon(xs:string Username, xs:string Password, ns0:WebServiceTypes WebServiceType, ns0:TokenDeveloperDetails DeveloperSettings, ns0:TokenApplicationDetails ApplicationSettings, )
         Types (12):
            ns3:ArrayOfKeyValueOfstringstring
            ns1:ArrayOfValidationDetail
            ns0:Logon
            ns0:TokenApplicationDetails
            ns0:TokenDeveloperDetails
            ns1:ValidationDetail
            ns4:ValidationFault
            ns0:WebServiceTypes
            ns0:affilinetWebserviceFault
            ns2:char
            ns2:duration
            ns2:guid

Прежде чем вы сможете использовать client.service.Logon() you 'нам нужно будет соответствовать сигнатуре типа, требуемой этим методом.Вам придется создавать объекты различных типов, используя client.factory.create() (например, client.factory.create('ns0:WebServiceTypes')), и передавать эти объекты вместе с вашим именем пользователя / паролем.

...