Как использовать Zeep для создания SOAP-запросов в Python

Вот мой xml:

<?xml version="1.0"?>
<soapenv:Envelope>
  <soapenv:Header xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <wsse:Security soap:mustUnderstand="1" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
      <wsse:UsernameToken wsu:Id="UsernameToken-1" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
        <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">1234</wsse:Password>
      </wsse:UsernameToken>
    </wsse:Security>
  </soapenv:Header>
  <soapenv:Body xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <root xmlns="http://xmlns.oracle.com/Enterprise/tools/schema/InfoRtRequest.v1">
      <EMAIL>david</EMAIL>
    </root>
  </soapenv:Body>
</soapenv:Envelope>

вот мое демо:

wsdl = ''

client = Client(
    wsdl,
    wsse=UsernameToken('USERNAME', '1234'))

response = client.service.get_method(
    EMAIL='david')

это подняло VadlidationError:

ValidationError: Missing element OPRID (root.OPRID)

Я не знаю почему, пожалуйста, помогите мне, спасибо.

0 ответов

zeep - продвинутая библиотека для обработки сообщений SOAP в python. Вы должны предоставить файл wsdl, чтобы ваша проблема могла быть лучше проанализирована.

Но, глядя на предоставленный вами xml-запрос, кажется, что аутентификация выполняется с использованием заголовков и данные отправляются в теле. Подобно тому, который я недавно исправил. См. Мой XML-запрос моего варианта использования ниже.

<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
    <soap-env:Header>
        <ns0:myheaders xmlns:ns0="xxxxxx_stackru_mask_xxxxxx">
            <ns0:username>xxxxxx_stackru_mask_xxxxxx</ns0:username>
            <ns0:password>xxxxxx_stackru_mask_xxxxxx</ns0:password>
        </ns0:myheaders>
    </soap-env:Header>
    <soap-env:Body>
        <ns0:Search02c xmlns:ns0="xxxxxx_stackru_mask_xxxxxx">
            <ns0:name>
                <ns0:title>Mr</ns0:title>
                <ns0:forename>Srikanth</ns0:forename>
                <ns0:surname>Badveli</ns0:surname>
            </ns0:name>
        </ns0:Search02c>
    </soap-env:Body>
</soap-env:Envelope>

Для приведенного выше XML, код выглядит следующим образом

from zeep import Client
header_credentials = {'username':'xxxxx','password':'xxxxx'}
tac_data = {'name': {'title':'xxxxx','forename':'xxxxx','surname':'xxxxx'}}

client = Client(wsdl=wsdl)
response = client.service.Search02c(tac_data, _soapheaders={'callcreditheaders':header_credentials})

В приведенном выше коде "Search02c" является именем операции для службы. Имя операции можно найти при проверке файла wsdl. В моем случае "Search02c" принимает 2 аргумента, которые являются body и header. "Tac_data" - это словарь xml body (не header), а "header_credentials" - словарь учетных данных. Ваш вариант использования может принимать заголовок и тело с одним аргументом. Структура аргументов может быть найдена после имени операции в проверяемом файле wsdl.

Вы можете найти имя операции и ее структуру в конце вывода, запустив ее в командной строке.

python -mzeep wsdl_file_path.wsdl

Операция для моего файла wsdl ниже.

Operations:
    Search02c(searchDefinition: tac_data, _soapheaders={'headers': header_credentials}) -> outputResult: ns1:output

Помните, что Zeep принимает словарь только в качестве входных данных и предоставляет словарь в качестве выходных данных. Если вы хотите получить ответ в формате xml, используйте raw_response=True в настройках клиента.

Для получения дополнительной информации, пожалуйста, обратитесь к документации Zeep

Другие вопросы по тегам