如何在Python中POST一个XML元素

13 投票
3 回答
20797 浏览
提问于 2025-04-16 00:21

基本上,我有一个 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)

撰写回答