第二天,我努力完成一项看似微不足道的任务,该任务与通过 python 下的 suds 库发送 soap 请求有关。
您需要发送带有两个参数的请求。
在 python 方面,这样做是这样的:
client.service.exportSomething(id, tstamp)
如果两个参数都存在,则一切正常,将生成并发送以下 xml:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://наш_сервер">
<soapenv:Header/>
<soapenv:Body>
<ns:exportSomething>
<ns:some_id>xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx</ns:some_id>
<ns:tstamp>2000-01-01 00:00:00</ns:tstamp>
</ns:exportSomething>
</soapenv:Body>
</soapenv:Envelope>
问题是这两个参数都必须是可选的。我试着用一个空字符串代替None
,suds.null()。在这种情况下,库会生成参数标记为空的请求。例如,如果我尝试用一个空值替换 tstamp,我会得到这个 xml:
...
<ns:exportSomething>
<ns:some_id>xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx</ns:some_id>
<ns:tstamp/>
</ns:exportSomething>
...
而不是响应,我得到一个错误。
我用谷歌搜索了你需要在标题标签中的请求的 xml 中写的内容,如下所示:xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
然后可以指示缺少这样的值:
<ns:tstamp xsi:nil="true" />
如果我手动发送这样的 xml 请求(例如,通过 SoapUI 程序),那么我会得到我期望的响应。
但是我如何通过 suds 在 python 脚本中发送这样的请求?
UPD:在创建客户端对象时注释掉缓存设置后,以 suds.null () 作为参数的请求开始正常工作。这有什么关系,我需要做什么才能使一切都在启用缓存的情况下工作?
清除缓存后,一切正常。
我仍然不明白为什么在未清除缓存时 suds 将 suds.null() 视为正常的 None。