Измените пространство имен xmlns: wsse в запросе SOAP с помощью Python Zeep - PullRequest
0 голосов
/ 10 апреля 2019

При использовании 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, это работает.

1 Ответ

1 голос
/ 12 апреля 2019

Решено путем переключения на использование другой библиотеки SOAP.

...