Ho implementato un modulo API di Pivotal Tracker in Python 2.7. Lo Pivotal Tracker API si aspetta che i dati POST siano un documento XML e "application/xml" sia il tipo di contenuto.Come posso inserire caratteri non ASCII utilizzando httplib quando il tipo di contenuto è "application/xml"
Il mio codice usa urlib/httplib di inviare il documento come mostrato:
request = urllib2.Request(self.url, xml_request.toxml('utf-8') if xml_request else None, self.headers)
obj = parse_xml(self.opener.open(request))
questo produce un'eccezione quando il testo XML contiene caratteri non ASCII:
File "/usr/lib/python2.7/httplib.py", line 951, in endheaders
self._send_output(message_body)
File "/usr/lib/python2.7/httplib.py", line 809, in _send_output
msg += message_body
exceptions.UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 89: ordinal not in range(128)
Da quanto posso see, httplib._send_output sta creando una stringa ASCII per il payload del messaggio, presumibilmente perché si aspetta che i dati siano codificati URL (application/x-www-form-urlencoded). Funziona bene con application/xml purché vengano utilizzati solo caratteri ASCII.
Esiste un modo semplice per inviare dati application/xml contenenti caratteri non ASCII o sto andando a dover passare da un anello all'altro (ad esempio utilizzando Twistd e un produttore personalizzato per il carico utile POST)?
Forse potresti cambiare il tipo di contenuto delle intestazioni, ma come risolvere il problema? Il 'msg' viene costruito nelle librerie python, ed è una stringa di byte. – jro
@jro: non ha nulla a che fare con HTTP. Guarda l'esempio * completo * sopra. – jfs
Ho capito che questo causa il problema, ma il mio punto era che non ha il controllo sulla variabile 'msg'. Sono d'accordo con il tuo punto, ma la mia domanda è più in linea di come questo fatto possa aiutarlo a risolverlo quando nella libs 'msg' viene creato come' msg = "\ r \ n" .join (self._buffer) '? – jro