2016-06-06 15 views
0

Ich verwende Python-Anfragen 2.2.1 und versuche, eine Anfrage mit einem benutzerdefinierten Header zu posten.Kann das Header-Feld von requests.post ein Unicode-Objekt sein?

ich meine eigenen Header erstellen, myheader, wie folgt aus:

myheader = {'name' : myvalue } 

Die Sache ist myvalue ist ein Unicode-Objekt. Ich kodiere es nicht zu einer Byte-Zeichenkette, sondern setze es direkt in das myheader Wörterbuch.

und wenn ich das tue:

r = requests.post(myhost, headers=myheader) 

Ich erhalte eine Ausnahme:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 17-18: ordinal not in range(128) 

Und ich denke, ich es bekommen konnte los, indem myvalue.encode('utf8') tun, bevor es im header Wörterbuch setzen - aber mein Frage ist, ist es dann illegal, ein Unicode-Objekt in den Header zu legen? Ich frage, weil die Antwort problemlos Unicode-Objekte enthalten kann, also warum kann ich keine in die Kopfzeile einfügen?

Antwort

0

Header sind nicht Unicode-Daten, nicht. Sie sind nicht Teil des POST-Nachrichtentexts (der bei Bedarf für Sie kodiert ist und ansonsten beliebige Binärdaten enthalten kann).

Die überwiegende Mehrheit der HTTP-Header kodieren Informationen, die nur das ASCII-Zeichenset auf jeden Fall benötigen. Beispielsweise enthält ein Accept-Language Header nur ISO-639-Sprachcodes mit optionalen ISO-3166-Ländercodes sowie q, ;, = und numerische Informationen.

Es ist allgemein akzeptiert, dass HTTP-Header können enthalten auch Latin-1 (ISO-8859-1) Zeichen (also bis zu Unicode U + 00FF); speziell die HTTP 1.1 Warning header specification verwendet Latin-1 als Standard. Wenn Sie Text in eine Kopfzeile außerhalb des Latin-1-Bereichs codieren müssen, codieren Sie den folgenden Text: RFC 2047. In Python, können Sie dies mit email.header.Header() objects:

from email.header import Header 

myheader = {'name': str(Header(u'Some unicode value', 'utf-8'))} 
+0

ist es ein Vorteil der Verwendung von 'email.header' über nur tun' someunicodevalue.encode ('UTF-8') '? – patchwork

+0

@patchwork: Es ist standardkonform, dh es sollte mit * jedem * HTTP-Server funktionieren und nicht zurückgewiesen werden, da der Header nicht als Latin-1 decodiert werden kann. –

+0

Ich habe einen Client, in Python mit Flask geschrieben, der die Anfrage empfängt. Aber wenn ich die Header mit der Flask-Definition einer HTTP-Anfrage abrufe, bekomme ich Unicode-Objekte. Kein großes Problem, aber verwirrend angesichts Ihrer Antwort (die ich akzeptiert habe) – patchwork

Verwandte Themen