我正在尝试创建一个使用WSDL文件并生成正确SOAP消息的客户端。 这就是我创建客户端的方式:
client = Client(
wsdl=wsdl
,transport = transport
,wsse = Signature('key.pem', 'cert.pem')
)
zeep代码中的注释表明它应该生成类似于XML的XML:
<soap:Header>
<wsse:Security mustUnderstand="true">
<wsu:Timestamp>
<wsu:Created>2015-06-25T21:53:25.246276+00:00</wsu:Created>
<wsu:Expires>2015-06-25T21:58:25.246276+00:00</wsu:Expires>
</wsu:Timestamp>
</wsse:Security>
</soap:Header>
但是,它不会添加mustUnderstand
属性,TimeStamp
为空。有没有人知道如何确保正确设置这些字段?
答案 0 :(得分:2)
from datetime import datetime, timedelta from lxml import etree from zeep import Client from zeep.wsse import utils from zeep.plugins import HistoryPlugin # Справочники wsdl = 'http://claim-test2.isb.az:8903/cib/svc/wsdl/codetable.wsdl' username, password = 'ws', '********' bussines_user = '********' class UsernameTokenTimestamp: def __init__(self, username, password=None): self.username = username self.password = password def apply(self, envelope, headers): security = utils.get_security_header(envelope) created = datetime.now() expired = created + timedelta(seconds=5 * 60) token = utils.WSSE.UsernameToken() token.extend([ utils.WSSE.Username(self.username), utils.WSSE.Password(self.password), utils.WSSE.Nonce('43d74dda16a061874d9ff27f2b40e017'), utils.WSSE.Created(utils.get_timestamp(created)), ]) timestamp = utils.WSU('Timestamp') timestamp.append(utils.WSU('Created', utils.get_timestamp(created))) timestamp.append(utils.WSU('Expires', utils.get_timestamp(expired))) security.append(timestamp) security.append(token) # # headers['Content-Type'] = 'application/soap+xml;charset=UTF-8' return envelope, headers def verify(self, envelope): pass history = HistoryPlugin() client = Client( wsdl=wsdl, wsse=UsernameTokenTimestamp(username=username, password=password), plugins=[history] )