【发布时间】:2015-09-10 11:23:22
【问题描述】:
我想使用 Python 脚本查询 XML-RPC 服务器。
第一个障碍是服务器使用身份验证,我不得不求助于 requests.Session 来克服这个问题。现在我做到了,我可以通过 RPC 查询服务器,但是我使用 相当丑的机制来做到这一点 - 粘合字符串。当然,这只会产生 XML 数据,我必须再次手动处理才能将其转换为可用的列表或字典。
我发现有一个用于 Python 的 xmlrpc 模块,它允许干净地使用服务器;但是,在使用 XML-RPC 之前,我找不到如何对自己进行身份验证。
这是我已经使用请求编写的代码:
from requests import Session
myserver_address='http://myserver.test.com/admin'
myserver_RPC=myserver_address+'?RPC2'
myserver_header={'Content-Type': "text/xml; charset=UTF-8"}
myserver_login={"srvAction":"LoginAdmin", "login":"testuser", "password":"testpassword", "Submit":"Login", "select_locale":"en"}
myserver_login2={"srvAction":"LoginOrg", "selectSection":"20", "submit":"Continue"}
method_header = '<methodCall xmlns:ex="http://ws.apache.org/xmlrpc/namespaces/extensions"><methodName>'
param_header = '</methodName><params>'
param_body_header = '<param><value><string>'
param_body_footer = '</string></value></param>'
method_footer = '</params></methodCall>'
def myserver_get_xml(myserver_method, myserver_method_param):
param_body = ''
for param in myserver_method_param:
param_body = param_body + param_body_header + str(param) + param_body_footer
myserver_post = method_header + myserver_method + param_header + param_body + method_footer
page = s.post(myserver_RPC, myserver_post)
return page.text
s = Session()
s.get(myserver_address)
s.post(myserver_address, myserver_login)
s.post(myserver_address, myserver_login2)
s.headers.update(myserver_header)
result_xml = myserver_get_xml('myserverServer.getNetworkTree', ['31', ] )
print(result_xml)
所以问题是:
如何在经过身份验证的会话中使用 xmlrpc 模块?
如果这不可能,有什么好的方法可以将 XML 转换为字典(最好)或列表?
示例输出:
<?xml version="1.0" encoding="UTF-8"?><methodResponse xmlns:ex="http://ws.apache.org/xmlrpc/namespaces/extensions"><params><param><value><array><data><value><array><data><value>10.0.0.0/16</value><value><i4>1</i4></value><value>31</value></data></array></value><value><array><data><value>10.1.0.0/16</value><value><i4>2</i4></value><value>31</value></data></array></value></data></array></value></param></params></methodResponse>
【问题讨论】:
-
感谢@Bernhard,我想出了如何使用组合选项:我现在导入 xmlrpc.client 而不是丑陋的 myserver_get_xml 函数,并使用xmlrpc.client.dumps 函数如下: page_test = s.post(myserver_RPC, xmlrpc.client.dumps( params=('31', ), methodname='myserverServer.getNetworkTree') )。效果很好:-)
标签: python xml python-requests rpc xml-rpc