14

Basically I have this xml element (xml.etree.ElementTree) and I want to POST it to a url. Currently I'm doing something like

xml_string = xml.etree.ElementTree.tostring(my_element)
data = urllib.urlencode({'xml': xml_string})
response = urllib2.urlopen(url, data)

I'm pretty sure that works and all, but was wondering if there is some better practice or way to do it without converting it to a string first.

Thanks!

1

3 Answers 3

19

If this is your own API, I would consider POSTing as application/xml. The default is application/x-www-form-urlencoded, which is meant for HTML form data, not a single XML document.

req = urllib2.Request(url=url, 
                      data=xml_string, 
                      headers={'Content-Type': 'application/xml'})
urllib2.urlopen(req)
Sign up to request clarification or add additional context in comments.

1 Comment

Note that you don't have to build the opener. You can simply call urllib2.urlopen(req) -- urlopen can take Request objects as well as plain URL strings.
1

Here is a full example (snippet) for sending post data (xml) to an URL:

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

finally:

return xml_output

Comments

0

No, I think that's probably the best way to do it - it's short and simple, what more could you ask for? Obviously the XML has to be converted to a string at some point, and unless you're using an XML library with builtin support for POSTing to a URL (which xml.etree is not), you'll have to do it yourself.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.