Zeep с переменными пространства имен (?)

У меня есть API XML/WCF, с которым мне нужно что-то реализовать. Клиентская библиотека API предоставляется только как C# в Windows, и наша компания не занимается ни C#, ни Windows. Сейчас я экспериментирую с Python и zeep. API — это API системы контроля доступа Symmetry, если кому-то интересно.

Я могу подключиться к серверу и прочитать структуру wsdl. Это работает:

    URL='https://localhost/smsXMLWebService/SMSXMLWebService.svc?singleWsdl'
    URL2='https://localhost/smsXMLWebService/smsXMLWebService.svc'
    session = Session()
    session.verify = False
    transport = Transport(session=session)
    self.client = zeep.Client(URL, transport=transport)
    self.service = self.client.create_service('{http://tempuri.org/}WSHttpBinding_ISMSXMLWebService', URL2)

Теперь все, начиная с этого момента, потребует входа на платформу. В примере кода C# это делается следующим образом:

G4TAPI = new SMSXMLWebServiceClient();
G4TAPI.ClientCredentials.UserName.UserName = txtUserName.Text
G4TAPI.ClientCredentials.UserName.Password = txtPassword.Text.ToLower();
G4TAPI.G4TLogin();

У моего self.service теперь есть вызов G4TLogin(), и, кажется, он пытается подключиться, когда я прошиваю трафик. Но как мне установить имя пользователя и пароль, поскольку они не передаются в качестве параметров методу G4TLogin()?

Это не работает:

self.service.ClientCredentials.UserName.UserName = "api"

Это очень далеко от моей зоны комфорта, и я могу использовать здесь неправильную терминологию. Любые идеи?

Сообщение об ошибке

AttributeError: Service has no operation 'ClientCredentials'

person Hannu    schedule 20.12.2018    source источник


Ответы (1)


При использовании Zeep обязательно изучите пространства имен в URL-адресе WSDL, используя

python -mzeep "YourWsdlUrlGoesHere"

Получите параметры и создайте из них словарь Python (в моем случае перед C#, включая имя пользователя и пароль в словаре), обратите внимание, что может потребоваться создать вложенный словарь, как в моем случае.

from requests import Session
from requests.auth import HTTPBasicAuth,  HTTPDigestAuth

from zeep import Client

from zeep.transports import Transport



request =   { "Credential":{"Username": "yourusername",
  "Password": "yourpassword"},

  "RN": "150147119"
                        }

session = Session()

client = Client('http://your url and wsdl../Invoice.svc?Wsdl',transport=Transport(session=session))

r = client.service.NameOfYourService(request)

print(r)

Не передавайте пользователя и пароль в формальном формате Zeep. Прохождение словаря сработало для меня. В моем случае WSDL предложил, чтобы пользователь и пароль были указаны в учетных данных, а строка была передана в RN, и, наконец, все было передано в одной переменной.

person sorento    schedule 11.04.2020