SOAPpy中的命名空间未按预期工作
我在使用Axis2运行的SOAP API时遇到了问题:
我应该调用一个登录方法,传入两个参数(登录名和密码),然后它会返回一个认证令牌,我可以用这个令牌进行后续的操作。
#!/usr/bin/python
from SOAPpy import SOAPProxy
s_user = 'Administrator'
s_pass = 'securityThroughObscurity'
s_host = '192.168.76.130:8998'
namespace = 'http://bcc.inc.com/IncSecurity'
url = 'http://' + s_host + '/axis2/services/IncSecurityService'
DHCPServ = SOAPProxy(url, namespace)
DHCPServ.config.dumpSOAPOut = 1
DHCPServ.config.dumpSOAPIn = 1
DHCPResp = DHCPServ.login(loginName=s_user, password=s_pass)
但是,Axis2服务器返回了一个XML错误,内容是OM节点的数据元素为NULL
。查看Axis2的日志,我发现错误信息是adb_login.c(383) 非空或最小出现次数不等于0的元素loginName缺失
接着,我抓取了一个已知正常工作的Java客户端的login
XML和我这个客户端的XML,发现它们之间有以下区别:
SOAPpy:
<ns1:login xmlns:ns1="http://bcc.inc.com/IncSecurity" SOAP-ENC:root="1">
<password xsi:type="xsd:string">securityThroughObscurity</password>
<loginName xsi:type="xsd:string">Administrator</loginName>
</ns1:login>
Java:
<ns2:login xmlns:ns2="http://bcc.inc.com/IncSecurity">
<ns2:loginName>Administrator</ns2:loginName>
<ns2:password>securityThroughObscurity</ns2:password>
</ns2:login>
这意味着由于某种原因(可能是因为我对Python和SOAPpy的了解不够),在login
方法中使用的变量没有正确应用命名空间,所以从某种程度上来说,这些变量实际上是不存在的,因此错误是合理的。
另外,它似乎还把变量的位置搞错了,把密码放在了登录名之前,但我觉得这问题不大。
我到底哪里做错了呢?
1 个回答
2
看起来这是SOAPPy中的一个已知问题,有人建议了一个简单的修复方法:http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=523083
另外,如果你能访问服务的WSDL文件,SOAPPy允许你指定一个WSDL,而不仅仅是一个命名空间。这样做似乎能给信封生成的代码提供更好的命名空间信息。http://diveintopython.net/soap_web_services/introspection.html
最后,如果SOAPPy对你来说就是不管用,可以试试Suds(它的文档更完善,比SOAPPy要好)。
from suds.client import Client
from suds.wsse import *
client = Client(WSDL_LOCATION)
guid = client.service.someFunctionName("a string argument", 42)
祝你好运!