При использовании Zeep (Python3.7) для отправки данных в SOAP API генерируется заголовок wsse:Security
: http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd
В результате возникает ошибка:
zeep.exceptions.Fault: SOAP Security Header UsernameToken is required for operation 'ProcessMessage'
Если я тогда возьму необработанный XML-запрос и отправлю его в API (через SOAPUI), я получу ту же проблему.Однако, если я изменю это значение на значение, которое было в примере, который я отправил вместе с WSDL http://schemas.xmlsoap.org/ws/2002/07/secext
, запрос успешно завершится, и я получу ответ об успешном выполнении от API.
У меня естьперепробовал много вещей, включая точное определение пространства имен в заголовке элемента безопасности:
header = xsd.Element(
'{http://schemas.xmlsoap.org/ws/2002/07/secext}Security',
xsd.ComplexType([
xsd.Element(
'UsernameToken',
xsd.ComplexType([
xsd.Element('Username', xsd.String()),
xsd.Element('Password', xsd.String()),
])
)
])
)
Однако, похоже, это не решает проблему.
Я также пробовал:
client.set_default_soapheaders([header_value])
Опять же, нет радости.
Есть ли способ сделать это в Zeep (я открыт для другого пакета SOAP, хотя Zeep выглядел наиболее активно поддерживаемым)?Или я что-то пропустил в своем формате запроса, который мог вызвать эту проблему?
Код ниже.Заранее спасибо!
header = xsd.Element(
'Security',
xsd.ComplexType([
xsd.Element(
'UsernameToken',
xsd.ComplexType([
xsd.Element('Username', xsd.String()),
xsd.Element('Password', xsd.String()),
])
)
])
)
header_value = header(UsernameToken={'Username': user, 'Password': password})
client.service.ProcessMessage(_soapheaders=[header_value], Payload=dataobj)
С точки зрения сгенерированного XML, приведенный выше пример дает следующее:
<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/07/secext">
<soap-env:Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken>
<wsse:Username>username</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">password</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soap-env:Header>
<soap-env:Body>
### REQUEST BODY
</soap-env:Body>
</soap-env:Envelope>
Что не работает
Однако простоизменив значение wsse:Security xmlns:wsse
на http://schemas.xmlsoap.org/ws/2002/07/secext
в необработанном XML и вставив его в SOAPUI, это работает.