我正在构建一个应用程序,它将执行以下操作:
- 将 XML 发布到 HTTP 地址
- 获取响应并将其存储在远程 mssql db 上的表中
- 再次发布 XML 并将响应与之前存储在数据库中的内容进行比较
- 寻找某些差异,当它们存在时,将 XML 发布到 HTTP 地址
- 获取新的响应,并根据需要对其进行解析,将结果发送到另一个 mssql 表。
HTTP 服务器使用摘要身份验证,我在 python 中工作时遇到了各种麻烦。这是我第一次涉足 python,我正在学习各种各样的东西......但我似乎无法理解这一点。有没有人有python中摘要认证的任何真正好的例子?我想让这件事继续下去,并尝试自己完成其余的工作。理想情况下,我想使用 cookie 来保持会话打开。
谢谢!
编辑
这是我到目前为止所拥有的,以及它输出的内容:
url = "https://url.here.com/xml"
xml = '''<request method=\"switchvox.currentCalls.getList\"><parameters></parameters></request>'''
user = "user"
secret = "secret"
realm = "switchvox_api_auth"
passwdmngr = urllib2.HTTPPasswordMgrWithDefaultRealm()
passwdmngr.add_password(realm,url,user,secret)
authhandler = urllib2.HTTPDigestAuthHandler(passwdmngr)
opener = urllib2.build_opener(authhandler)
urllib2.install_opener(opener)
req = urllib2.Request(url)
req.add_header('Content-Type', 'application/xml')
res = urllib2.urlopen(req, xml)
print res.read
这是我回来的:
<bound method _fileobject.read of <socket._fileobject object at 0xb75c741c>>
我改变什么似乎并不重要,这就是我能摆脱的一切。我目前正在使用 lxml 重新处理 xml;一旦我完成了,我会再次检查并报告。
编辑
改为使用 lxml,最后正确打印..
import urllib2
from lxml import etree
#defining xml request for current calls:
# <request method="switchvox.currentCalls.getList">
# <parameters>
# </parameters>
# </request>
request = etree.Element("request")
parameters = etree.SubElement(request, "parameters")
xml = etree.tostring(request, pretty_print=True)
url = "https://url.here.com/xml"
user = "user"
secret = "secret"
realm = "switchvox_api_auth"
passwdmngr = urllib2.HTTPPasswordMgrWithDefaultRealm()
passwdmngr.add_password(realm,url,user,secret)
authhandler = urllib2.HTTPDigestAuthHandler(passwdmngr)
opener = urllib2.build_opener(authhandler)
urllib2.install_opener(opener)
req = urllib2.Request(url)
req.add_header('Content-Type', 'application/xml')
res = urllib2.urlopen(req, xml)
response = res.read()
print response