我有一个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'
答案 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中传递一个字符串,最后将所有字符串都传递到一个变量中。