我正在执行一个 SOAP Web 服务的方法,该方法使用 suds 库接收 3 个字符串参数。
第一个字符串参数应该是一个 XML,另外两个是用户名和密码,这是我的半工作实现。
from suds.client import Client
url = "http://www.jonima.com.mx:3014/sefacturapac/TimbradoService?wsdl"
client = Client(url)
client.service.timbrado(XML_AS_STRING_HERE, 'PRUEBA1', '12345678')
当第一个参数包含转义字符(& 符号、引号、撇号、小于、大于)时,方法不起作用,因为服务器将文本解释为未转义。如果不包含任何这些字符,则该方法效果很好
不带符号的 XML 示例有效 http://dl.dropbox.com/u/1990697/no_amp.xml
带有 & 符号的 XML 示例不起作用 http://dl.dropbox.com/u/1990697/with_amp.xml
知道如何传递带有转义字符的 XML 吗?
它不必依赖于 suds,而是在 python 中。 我正在使用 python 2.6(如果需要,它怎么可能与 2.7 一起使用)
我也在用Django框架,不知道有没有用。
额外信息:
- 我无权修改 SOAP 服务器
- 客户支持人员告诉我我的 xml 是正确的并且它们适用于 他们,所以错误是在我的实现中(或在泡沫的某个地方?)
最佳答案
我认为 suds 库是这里的罪魁祸首。当您将转义的 xml 作为 client.service.timbrado
方法的参数发送到 suds 时,它也会对其进行转义。但是,它看到您已经像这样转义了 & 符号:
...
descripcion="EJE&MPLO"
...
它不会进一步逃避它(尽管它应该)。在将转义的 xml 传递给 client.service.timbrado
之前,您应该通过 xml.sax.saxutils.escape
运行转义的 xml。
这应该导致上面的 xml 片段看起来像这样:
...
descripcion="EJE&MPLO"
...
当我使用双重转义的 xml 运行您的代码时,我收到以下结果:
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:timbradoResponse xmlns:ns2="http://sefactura.com">
<return>
<status>401 - Fecha y hora de generación fuera de rango</status>
</return>
</ns2:timbradoResponse>
</S:Body>
</S:Envelope>
这是关于您的数据的错误(生成日期和时间超出范围),而不是关于 xml 的格式。
关于python - 使用带有转义字符作为参数的 XML 使用 WSDL url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7619328/