Как отформатировать XML-запрос от WSDL с помощью Zeep в Python - PullRequest
0 голосов
/ 13 июня 2019

У меня есть пример запроса xml, который должен идти на сервер SOAP, например:

<soapenv:Envelope 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ser="http://service.example.com" 
xmlns:bos="http://bos.example.com"
xmlns:ser1="http://service.example.com">
<soapenv:Header/>
<soapenv:Body>
<ser:UploadRequest ac="YY">
<ser:updateRecord>
<ser:employee ptc="xxx" lastname="Example" firstname="Employee" 
gender="F">
<bos:employment eID="testEmployee" doj="2000-01-17"/>
<bos:employment-status startDate="2000-01-17" status="active"/>
</ser:employee>
</ser:updateRecord>
</ser:UploadRequest>
</soapenv:Body>
</soapenv:Envelope>

Имя службы здесь - «Загрузить», а действие - updateRecord. Мне не удалось отформатировать этот запрос, используя python zeep.

Я протестировал с помощью soapui, и он работает. Теперь мне нужно отправить запрос, используя python и zeep, но мне все равно не удалось, так как я новичок в SOAP и Zeep.

Вот что я попробовал:

from requests import Session
from zeep import Client
from zeep.cache import SqliteCache
from zeep.transports import Transport
from lxml import etree

session = Session()
session.cert = 'client.pem'
transport = Transport(session=session,cache=SqliteCache())
client = Client('example.wsdl',transport=transport)


request_data = {
'updateRecord':{
    'ac': 'HF',
    'ptc': 'yy',
    'lastname':'Lasme',
    'firstname':'Didier',
    'gender':'M',
    'eID':'ACI001014',
    'doj':'2000-01-17'
    }
}

xml = client.create_message(client.service,'Upload',**request_data)
print(etree.tostring(xml, encoding="unicode", pretty_print=True))

и я получаю эту ошибку

TypeError: {http://service.example.com}UpdateRecord() получил
неожиданный аргумент ключевого слова 'eID'. Подпись: `сотрудник:
{http://bos.example.com}Employee

Что мне нужно, так это использовать Zeep для форматирования вышеуказанного запроса.

1 Ответ

0 голосов
/ 15 июля 2019

Импорт параметра parseString из пакета xml

from xml.dom.minidom import parseString

Затем следуйте приведенному ниже коду

result = parseString(xml).toprettyxml() # xml is your variable
print(result)

Результат:

<?xml version="1.0" ?>
<employees>
  <employee>
    <Name>Leonardo DiCaprio</Name>
  </employee>
</employees>
...