使用Python Suds和Cisco Axl获取正确的属性嵌套

0 投票
1 回答
1670 浏览
提问于 2025-04-18 01:13

我一直在尝试用Python来让Cisco Call Manager的AXL工作,而不是用php(在php上我已经没问题了),但是遇到了一些麻烦。我花了好几个小时在这个问题上纠结,所以我想请教一下大家,看看有没有人能给我一些建议。

下面是我整理过的代码:

from suds.client import Client
from suds.transport.https import HttpAuthenticated
import logging

logging.basicConfig(level=logging.CRITICAL)
logging.getLogger('suds.client').setLevel(logging.DEBUG)
logging.getLogger('suds.transport').setLevel(logging.CRITICAL)
logging.getLogger('suds.xsd.schema').setLevel(logging.CRITICAL)
logging.getLogger('suds.wsdl').setLevel(logging.CRITICAL)

service = 'https://IPADDRESS:PORT/axl/'

wsdl = 'file:///PATH/TO/LOCAL/WSDL/AXLAPI.wsdl'

username = "username"

password = "password"

client = Client(wsdl, location = service, transport = HttpAuthenticated(username = username, password = password))

name = "NAME_DP"

tags = ["regionName"]

print "<THIS IS A LISTDEVICEPOOL REQUEST>"
dp = client.factory.create('ns0:ListDevicePoolReq')
dp.searchCriteria.name = name
dp.returnedTags = tags
result = client.service.listDevicePool(dp)
print "<THIS IS THE RESULT>"
print result

问题是,soap的输出结果变成了:

DEBUG:suds.client:headers = {'SOAPAction': u'"CUCM:DB ver=8.5 listDevicePool"',
'Content-Type': 'text/xml; charset=utf-8'}
ERROR:suds.client:<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:ns0="http://www.cisco.com/AXL/API/8.5" xmlns:ns1="http:
//schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchem
a-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <ns1:Body>
      <ns0:listDevicePool>
         <searchCriteria>
            <searchCriteria>
               <name>NAME_DP</name>
            </searchCriteria>
            <returnedTags>regionName</returnedTags>
         </searchCriteria>
      </ns0:listDevicePool>
   </ns1:Body>
</SOAP-ENV:Envelope>
DEBUG:suds.client:http failed:
<?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://sc
hemas.xmlsoap.org/soap/envelope/"><soapenv:Body><soapenv:Fault><faultcode>soapen
v:Server</faultcode><faultstring>Usage: Required returnedTags as empty tag or sh
ould contain requested tags</faultstring><detail><axlError><axlcode>5003</axlcod
e><axlmessage>Usage: Required returnedTags as empty tag or should contain reques
ted tags</axlmessage><request>listDevicePool</request></axlError></detail></soap
env:Fault></soapenv:Body></soapenv:Envelope>
Traceback (most recent call last):
  File "C:\Users\C53170\Desktop\sudstest\barebones.py", line 39, in <module>
    result = client.service.listDevicePool(dp)
  File "C:\Python27\lib\site-packages\suds\client.py", line 542, in __call__
    return client.invoke(args, kwargs)
  File "C:\Python27\lib\site-packages\suds\client.py", line 602, in invoke
    result = self.send(soapenv)
  File "C:\Python27\lib\site-packages\suds\client.py", line 649, in send
    result = self.failed(binding, e)
  File "C:\Python27\lib\site-packages\suds\client.py", line 702, in failed
    r, p = binding.get_fault(reply)
  File "C:\Python27\lib\site-packages\suds\bindings\binding.py", line 265, in ge
t_fault
    raise WebFault(p, faultroot)
suds.WebFault: Server raised fault: 'Usage: Required returnedTags as empty tag or should         contain requested tags'

你可以看到,它把所有东西(包括我定义的searchCriteria)都放在了searchCriteria这个属性里面,这导致返回的returnedTags属性被当作searchCriteria的一部分。我现在搞不清楚为什么会这样,也不知道该怎么修正。是不是wsdl导入的时候出了问题?

如果你需要查看我导入的wsdl或xsd文件,请告诉我。它们比较大,我这台电脑无法访问pastebin或google docs(在公司被封了),但我可以找个地方把它们上传。

非常感谢你的帮助!

1 个回答

0

这是处理listPhone的代码,但它也应该适用于listPoolDevice。你可以在你的代码中使用调试和日志记录命令,结合我的代码,看看你的请求在发送时应该是什么样子。我觉得这样做能解决你的问题,并帮助你开始使用Python与CUCM和AXL进行交互。

from suds.client import Client

cmserver = '10.10.10.10'
cmport = '8443'
wsdl = 'file:///your/system/path/schema/current/AXLAPI.wsdl'
location = 'https://' + cmserver + ':' + cmport + '/axl/'
username = 'username'
password = 'password'

client = Client(wsdl,location=location, username=username, password=password)

result = client.service.listPhone({'name':'SEP%'},{'name':'','model':''})

for node in result['return']['phone']:
    print str(node['name']), str(node['model'])

撰写回答