如何在Python中POST一个XML元素
基本上,我有一个 XML 元素(使用 xml.etree.ElementTree),我想把它发送到一个网址。现在我做的方式是这样的:
xml_string = xml.etree.ElementTree.tostring(my_element)
data = urllib.urlencode({'xml': xml_string})
response = urllib2.urlopen(url, data)
我相信这样是可以的,但我在想有没有更好的方法,或者有没有办法不先把它转换成字符串就直接发送。
谢谢!
3 个回答
0
不,我觉得这样做可能是最好的方法——简单又直接,还有什么比这更好的呢?显然,XML最终得转换成字符串,除非你使用的XML库本身就支持直接发送到网址(而xml.etree
并不支持),否则你得自己来处理这个转换。
1
这里有一个完整的例子(代码片段),用来向一个网址发送POST数据(XML格式):
def execQualysAction(username,password,url,request_data):
import urllib,urrlib2
xml_output = None
try:
base64string = base64.encodestring('%s:%s' % (username, password)).replace('\n', '')
headers = {'X-Requested-With' : 'urllib2','Content-Type': 'application/xml','Authorization': 'Basic %s' % base64string}
req = urllib2.Request(url=url,data=request_data,headers=headers)
response = urllib2.urlopen(req,timeout=int(TIMEOUT))
xml_output = response.read()
if args.verbose>1:
print "Result of executing action request",request_data,"is:",xml_output
except:
xml_output = '<RESULT></RESULT>'
traceback.print_exc(file=sys.stdout)
print '-'*60
最后:
return xml_output
18
如果这是你自己做的API,我建议你使用POST请求时选择 application/xml
这个格式。默认情况下,它是 application/x-www-form-urlencoded
,这个格式是用来处理HTML表单数据的,而不是用来发送单个的XML文档。
req = urllib2.Request(url=url,
data=xml_string,
headers={'Content-Type': 'application/xml'})
urllib2.urlopen(req)