【发布时间】:2011-01-05 15:18:04
【问题描述】:
当我尝试执行这段代码时:
mmurl = 'http://server/_mmwebext/mmwebext.dll?WSDL?server=localhost'
mmclient = Client(mmurl, plugins=[EnvelopeFixer()])
loginResult = mmclient.service[1].Login(u'localhost', u'user', u'pass')
以下信封已创建:
<SOAP-ENV:Envelope xmlns:ns0="http://menandmice.com/webservices/" xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<ns1:Body>
<ns0:Login>
<ns0:server>localhost</ns0:server>
<ns0:loginName>user</ns0:loginName>
<ns0:password>pass</ns0:password>
</ns0:Login>
</ns1:Body>
</SOAP-ENV:Envelope>
返回:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Client</faultcode>
<faultstring>Invalid command.</faultstring>
<detail>
<mmfaultdetails>
<message>Invalid command.</message>
<errorcode>5001</errorcode>
</mmfaultdetails>
</detail>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
但是如果我在soapUI中把它改成
<SOAP-ENV:Envelope xmlns:ns0="http://menandmice.com/webservices/" xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<ns0:Login>
<ns0:server>localhost</ns0:server>
<ns0:loginName>user</ns0:loginName>
<ns0:password>pass</ns0:password>
</ns0:Login>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
成功返回
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SOAP-ENV:Body>
<LoginResponse xmlns="http://menandmice.com/webservices/">
<session>UEk6A0UC5bRJ92MqeLiU</session>
</LoginResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
所以我的问题是我可以强制 suds 将 body 标签创建为 <SOAP-ENV:Body> 而不是 <ns1:Body> 还是
我尝试了这个,看看我是否可以更改通过网络发送的 XML,并使用 wireshark 来嗅探流量,结果发现它并没有改变正在发送的消息。由于我在控制台中看到了打印输出,因此肯定会调用发送方法
class EnvelopeFixer(MessagePlugin):
def sending(self, context):
# context is the envelope text
print type(context)
context.envelope = context.envelope.upper()
print context.envelope
return context
我将 EnvelopeFixer 更改为使用 marshalled 而不是发送,这似乎成功了
class EnvelopeFixer(MessagePlugin):
def marshalled(self, context):
root = context.envelope.getRoot()
envelope = root.getChild("Envelope")
envelope.getChildren()[1].setPrefix("SOAP-ENV")
print envelope.getChildren()[1]
return context
所以现在我更改了 body 元素的前缀以符合服务器的要求。快乐!
【问题讨论】:
-
嗨 davideagle,我用你的帖子修改了我自己的标题。但是我将 suds 设置为 suds.client 的调试模式,我看到尽管上下文根据我的需要进行了更改。但 suds 仍在发送之前的内容。你能帮帮我吗?
-
在再次运行 setup.py build 和 setup.py install 之前,您是否删除了之前的 egg 文件?
-
为什么我需要这样做?我正在使用
virtualenv,然后是pip install suds -
我下载了源代码并对此处提到的 EnvelopeFixer 进行了更改,卸载了之前的 egg 文件并运行了 setup.py build && setup.py install。安装不会更新安装的 egg 文件,因为它与以前的版本相同,这就是我手动删除它的原因