使用命名空间(?)变量进行压缩

时间:2018-12-20 13:29:18

标签: python zeep

我有一个XML / WCF API,我需要对其实施一些反对。 API客户端库仅在Windows中以c#的形式提供,而我们公司不提供c#或Windows。我现在正在尝试使用Python和zeep。如果有人感兴趣,该API是Symmetry访问控制系统API。

我可以连接到服务器并读取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'

1 个答案:

答案 0 :(得分:-1)

使用Zeep时,请确保使用

研究WSDL URL中的名称空间。
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中传递一个字符串,最后将所有字符串都传递到一个变量中。