我正在尝试使用Sage CRM的Web服务接口编写一个Python消费者。我正在使用SOAPpy作为Python SOAP库(与之无关,很容易在Ubuntu上安装,所以使用它)。
设法使用代理获取WSDL并执行Sage CRM公开的登录方法。
from SOAPpy import *
proxy = WSDL.Proxy('http://192.168.0.3/MATE/eware.dll/webservice/webservice.wsdl')
它返回一个session对象
位于151924492的SOAPpy.Types.structType结果:{'sessionid':'170911104429792'}
现在我尝试使用Sage CRM的queryrecord方法来查询数据,这将返回
错误SOAP-ENV:Server:未检测到活动用户会话
阅读文档会发现我必须发送回recd的会话id。当我带着每个请求登录时。
根据圣人的文件,我必须这样寄回去
SID = binding.logon("admin", "");binding.SessionHeaderValue = new SessionHeader();binding.SessionHeaderValue.sessionId = SID.sessionid;
有什么办法可以用SOAPpy把这个附加到头文件中吗?
任何指点都将非常感谢。
最佳答案
首先,就SOAPpy与其他soap库的比较发表评论。。。SOAPpy传统上是一个易于使用的库,它不支持复杂的数据结构。所以如果这对你的案子有用,那你就更好了。对于WSDL中更复杂的数据结构,您需要移动ZSI。
无论如何,SourceForge上项目的文档链接似乎已断开,因此我将在此处剪切并粘贴标题文档,并进行一些小的格式更改:
使用标题
SOAPpy有一个头类来保存SOAP消息头的数据。
每个头实例都有设置/获取MustUnderstand属性的方法,并且
方法来设置/获取Actor属性。
SOAPpy还有一个SOAPContext类,因此每个服务器方法都可以
以获取连接客户端的上下文的方式实现。
这包括通用的SOAP信息和连接信息(请参见
下面是一个例子)。
客户示例
import SOAPpy
test = 42
server = SOAPpy.SOAPProxy("http://localhost:8888")
server = server._sa ("urn:soapinterop")
hd = SOAPpy.Header()
hd.InteropTestHeader ='This should fault, as you don\'t understand the header.'
hd._setMustUnderstand ('InteropTestHeader', 0)
hd._setActor ('InteropTestHeader','http://schemas.xmlsoap.org/soap/actor/next')
server = server._hd (hd)
print server.echoInteger (test)
这应该成功(前提是服务器定义了echoInteger),因为
将MustUnderstand设置为0的有效头生成到此客户端
然后用这个头发送SOAP。
import SOAPpy
test = 42
server = SOAPpy.SOAPProxy("http://localhost:8888")
server = server._sa ("urn:soapinterop")
#Header
hd = SOAPpy.Header()
hd.InteropTestHeader = 'This should fault,as you don\'t understand the header.'
hd._setMustUnderstand ('InteropTestHeader', 1)
hd._setActor ('InteropTestHeader','http://schemas.xmlsoap.org/soap/actor/next')
server = server._hd (hd)
print server.echoInteger (test)
这将失败(即使服务器定义了“echoInteger”),因为
在此客户端中生成有效的头,但将MustUnderstand设置为1
对于服务器在发送之前可能无法理解的消息。