Seite 1 von 1

http request, unicode body

Verfasst: Donnerstag 5. Juli 2012, 13:30
von bone2
Ich bin gerade etwas am verzweifeln...

Wie sende ich per http request unicode xml daten?

Code: Alles auswählen

<xml>müll</xml>
Ich dachte daran das auch zu urlencoden. Dann meckert aber der server.
In allen anderen fällen meckert httplib/socket

zb:

Code: Alles auswählen

  File "e:\programme\Python27\Lib\httplib.py", line 790, in send
    self.sock.sendall(data)
  File "e:\programme\Python27\Lib\socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 69: ordinal not in range(128)
Mache sicher nur was banales falsch, aber ich komme einfach nich drauf und google is keine große hilfe

Re: http request, unicode body

Verfasst: Donnerstag 5. Juli 2012, 13:37
von BlackJack
@bone2: Unicode kannst Du gar nicht versenden, denn über Sockets gehen keine Zeichen sondern Bytes. Also musst Du das `unicode`-Objekt vorher als Bytestring (`str`) kodieren. Dazu sollte die Bibliothek mit der Du das XML erstellst Funktionalität bereitstellen.

Re: http request, unicode body

Verfasst: Donnerstag 5. Juli 2012, 13:55
von bone2
oh man....

Code: Alles auswählen

    conn.request("POST",
                 "/domain/update/" + tld + "/" + sld + "/123/",
                 xml,
                 {'content-type': 'text/xml; charset=utf-8'})
geht nicht

Code: Alles auswählen

    conn.connect()
    conn.putrequest("POST", "/domain/update/" + tld + "/" + sld + "/123/")
    conn.putheader('Content-Length', len(xml))
    conn.endheaders()
    conn.send(xml)
    response = conn.getresponse()
    conn.close()
selber das gleiche wie die lib machen geht...

Re: http request, unicode body

Verfasst: Donnerstag 5. Juli 2012, 14:49
von BlackJack
@bone2: Mal davon ausgehend, dass `xml` den Typ `unicode` hat, dann geht das natürlich nicht. Man kann `unicode` nicht über Sockets versenden. Du musst das vorher in eine Bytestring umwandeln. Am besten in dem Du die entsprechende Funktion verwendest, die von der Bibliothek bereitgestellt wird, mit der das XML erzeugt wurde. Bei `lxml` wäre das zum Beispiel die `lxml.etree.tostring()`-Funktion.