2013-07-26 12 views
6

Wie lese ich die rohe http Post STRING. Ich habe mehrere Lösungen zum Lesen einer geparsten Version des Posts gefunden, aber das Projekt, an dem ich gerade arbeite, übergibt eine rohe XML-Nutzlast ohne Header. Also versuche ich einen Weg zu finden, die Post-Daten zu lesen, ohne dass sie in ein key => value Array geparst werden.Python: BaseHTTPRequestHandler - Lesen Sie den rohen Post

Antwort

11

Ich denke, self.rfile.read(self.headers.getheader('content-length')) sollte die Rohdaten als Zeichenfolge zurückgeben. Nach der Dokumentation direkt in der BaseHTTPRequestHandler Klasse:

- rfile is a file object open for reading positioned at the 
start of the optional input data part; 
+2

Nachdem ich versucht habe, schnell zu googeln, blockiert diese Operation die Ausführung für mich und andere. – kwolfe

+1

Muss Inhalt Länge: Daten = Self.rfile.read (int (self.headers.getheader ('content-length'))) – kwolfe

+5

Ja, tut mir leid. Es blockiert, weil das rfile-Objekt ein Socket ist, und der Aufruf von 'read()' bedeutet im Grunde 'gelesen, bis nichts mehr zu lesen ist', aber es gibt mehr zu lesen, solange der Socket offen ist, also hängt er und wartet auf eingehenden Inhalt . Server vermeiden das Hängen durch IMMER spezifizieren, wie viel Inhalt gelesen wird. Tut mir leid, ich hätte das in erster Linie machen sollen. – smakateer

13

self.rfile.read(int(self.headers.getheader('Content-Length'))) werden die rohen HTTP POST-Daten als String zurück.

Brechen it down:

  1. Der Header 'Content-Length' gibt an, wie die HTTP-POST-Daten enthält viele Bytes.
  2. self.headers.getheader('Content-Length') gibt die Inhaltslänge (Wert des Headers) als Zeichenfolge zurück.
  3. Dieser Wert muss in eine Ganzzahl konvertiert werden, bevor er als Parameter an self.rfile.read() übergeben wird. Verwenden Sie dazu die Funktion int().

Beachten Sie auch, dass der Header-Name ist Groß- und Kleinschreibung, so dass es hat als 'Content-Length' nur angegeben werden.

Edit: Anscheinend Header-Feld wird nicht zwischen Groß- und Klein (zumindest in Python 2.7.5), die ich glaube, das richtige Verhalten seit https://tools.ietf.org/html/rfc2616 Zuständen:

Jedes Header-Feld besteht einen Name, gefolgt von ein Doppelpunkt (":") und der Feldwert. Feldnamen sind case-insensitive.

+0

Bitte seien Sie ausführlicher, ich habe keine Ahnung, was Sie vorschlagen. –

+1

@jb: Ich fügte der Antwort weitere Details hinzu. Lassen Sie mich wissen, ob es noch etwas Bestimmtes gibt, das noch ausgearbeitet werden muss. –

+0

@SindhuriKuppasad, der Kopfzeilenname unterscheidet nicht zwischen Groß- und Kleinschreibung. Die folgenden Anweisungen geben beide die Inhaltslänge in meinen Tests zurück: 'self.headers.getheader ('content-length')' und 'self.headers.getheader ('content-LENGTH')' – famzah