Я могу отправить простой запрос SOAP с Zeep.
with client.settings(strict=False):
resp = client.service.demandeFicheProduit(
demandeur=self.xxx, motDePasse=self.yyy,
ean13s="foo",
multiple=False)
Однако мне нужно несколько раз дать аргумент ean13s
, что невозможно при вызове функции Python, поэтому я решил, что мне нужно создать XML самостоятельно.
При включенной отладке Zeep я вижу, что отправлено XML:
<?xml version='1.0' encoding='utf-8'?>
<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
<soap-env:Body>
<ns0:demandeFicheProduit xmlns:ns0="http://fel.ws.accelya.com/">
<demandeur>xxx
</demandeur>
<motDePasse>yyy
</motDePasse>
<ean13s>foo
</ean13s>
<multiple>false
</multiple>
</ns0:demandeFicheProduit>
</soap-env:Body>
</soap-env:Envelope>
Так что мне нужно только скопировать
<ean13s>foo
</ean13s>
часть.
Глядя в Zeep, я вижу метод Transport.post_ xml: https://github.com/mvantellingen/python-zeep/blob/da8a88b9f5/src/zeep/transports.py#L86, который принимает дерево l xml в качестве параметра. ( do c)
def post_xml(self, address, envelope, headers):
"""Post the envelope xml element to the given address with the headers.
This method is intended to be overriden if you want to customize the
serialization of the xml element. By default the body is formatted
and encoded as utf-8. See ``zeep.wsdl.utils.etree_to_string``.
"""
message = etree_to_string(envelope)
return self.post(address, message, headers)
Я пытался post_raw_xml
метод, без etree_to_string
:
def post_raw_xml(self, address, raw_envelope, headers):
return self.post(address, raw_envelope, headers)
Я вызываю его с помощью выше XML
transport = zeep.Transport()
transport.post_raw_xml("adress", my_xml, {}) # {}: headers?
и статус ответа в порядке (200), однако служба отвечает, что это неверный запрос.
Есть ли XML / SOAP сложности, которые я не делал на что обратить внимание? Кодирование? Заголовки? (здесь {}
)
edit : после шпионажа немного больше внутренних устройств Zeep отправляемые им заголовки
{'SOAPAction': '""', 'Content-Type': 'text/xml; charset=utf-8'}
Так что я подумал, что могу просто использовать requests.post
, пока безрезультатно. Чтобы использовать requests
, см. Отправка SOAP запроса с использованием Python Запросов
Как в противном случае построить XML вручную?
Есть еще идеи о том, как Я могу продублировать аргумент eans13
?
Спасибо.