2010-06-24 17 views
12

Básicamente tengo este elemento xml (xml.etree.ElementTree) y deseo ENVIARLO a una url. Actualmente estoy haciendo algo comoCómo POSTAR un elemento xml en python

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

Estoy bastante seguro de que las obras y todo, pero se preguntaba si hay alguna mejor práctica o forma de hacerlo sin necesidad de convertirlo en una cadena en primer lugar.

Gracias!

+0

duplicado posible de [archivo de mensaje XML usando Python ] (https://stackoverflow.com/questions/16192638/post-xml-file-using-python) –

Respuesta

16

Si esta es su propia API, consideraría envíos como application/xml. El valor predeterminado es application/x-www-form-urlencoded, que está destinado a datos de formulario HTML, no a un único documento XML.

req = urllib2.Request(url=url, 
         data=xml_string, 
         headers={'Content-Type': 'application/xml'}) 
urllib2.urlopen(req) 
+0

Tenga en cuenta que no es necesario crear el abridor. Simplemente puede llamar a 'urllib2.urlopen (req)' - urlopen puede tomar objetos Request así como strings simples de URL. –

+0

Gracias, @Walter. –

0

No, creo que es probablemente la mejor manera de hacerlo - es corto y simple, ¿qué más se puede pedir? Obviamente, el XML tiene que convertirse en una cadena en algún momento, y a menos que esté utilizando una biblioteca XML con soporte integrado para POSTing a una URL (que no es xml.etree), tendrá que hacerlo usted mismo.

1

Aquí es un ejemplo completo (fragmento) para el envío de datos de envío (XML) a una 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 

por último:

return xml_output 
+0

Por favor, mejore su formateo. – pinckerman

Cuestiones relacionadas