使用 Zeep 向 SOAP 服务发送原始 XML 请求(尝试复制参数)

Sending a raw XML request to a SOAP service with Zeep (trying to duplicate an argument)

我可以用 Zeep 发送一个简单的 SOAP 请求。

    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 which takes an lxml tree as parameter. (doc)

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 的复杂性我没有注意?编码? Headers? (此处{}

edit:在对 Zeep 内部进行更多监视之后,它发送的 headers 是

{'SOAPAction': '""', 'Content-Type': 'text/xml; charset=utf-8'}

所以我想我可以简单地使用 requests.post,但没有用。要使用 requests,请参阅 Sending SOAP request using Python Requests

如何手动构建 XML?

还有关于如何复制 eans13 参数的更多想法吗?

谢谢。

我在没有 Zeep 的情况下解决了我的问题。

我使用 requests 发送原始 XML 字符串,我没有使用 lxml 或 xsd.

手动构建 XML

对我有帮助的是 print-debugging Zeep 的 transport.py/post 方法的内部结构(所以 headers 是 {'SOAPAction': '""', 'Content-Type': 'text/xml; charset=utf-8'} ),

另一个问题:Sending SOAP request using Python Requests 发送 post 请求:

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

并注意 XML 字符串(是的,在 <?xml> 结束标记后有一个换行符)。

缺点是解析 XML 回来。