http request, unicode body

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
bone2
User
Beiträge: 12
Registriert: Freitag 22. Juni 2012, 11:36

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
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.
bone2
User
Beiträge: 12
Registriert: Freitag 22. Juni 2012, 11:36

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...
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.
Antworten