Отправка необработанного запроса XML в службу SOAP с Zeep (попытка дублировать аргумент) - PullRequest
0 голосов
/ 14 февраля 2020

Я могу отправить простой запрос 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?

Спасибо.

1 Ответ

0 голосов
/ 19 февраля 2020

Я решил свою проблему без Zeep.

Я отправляю необработанную строку XML с requests, я не создаю XML вручную с l xml или xsd.

Что мне помогло, так это отладка и печать внутренних компонентов метода Zeep transport.py/post (поэтому заголовки {'SOAPAction': '""', 'Content-Type': 'text/xml; charset=utf-8'} ),

этот другой вопрос: Отправка SOAP запроса с использованием Python просит отправить запрос на публикацию:

requests.post(url, data=xml, headers=headers)

и быть осторожным со строкой XML (да, после закрывающего тега <?xml> есть символ новой строки).

Недостатком является разбор XML назад.

...