SOAPpy中的命名空间未按预期工作

3 投票
1 回答
2791 浏览
提问于 2025-04-16 14:46

我在使用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)

祝你好运!

撰写回答