2013-07-26 13 views
6

Come faccio a leggere il post http non elaborato STRING. Ho trovato diverse soluzioni per leggere una versione analizzata del post, tuttavia il progetto su cui sto lavorando invia un payload xml non elaborato senza un'intestazione. Quindi sto cercando di trovare un modo per leggere i dati del post senza che sia analizzato in una chiave => array di valori.Python: BaseHTTPRequestHandler - Leggi post non elaborato

risposta

11

Penso che self.rfile.read(self.headers.getheader('content-length')) dovrebbe restituire i dati non elaborati come una stringa. Secondo la documentazione direttamente all'interno della classe BaseHTTPRequestHandler:

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

Dopo aver provato e fatto qualche ricerca su google, questa operazione blocca l'esecuzione per me e per gli altri. – kwolfe

+1

È necessario fornire la lunghezza del contenuto: data = self.rfile.read (int (self.headers.getheader ('content-length'))) – kwolfe

+5

Sì, mi dispiace. Sta bloccando perché l'oggetto rfile è un socket, e chiamare 'read()' sta praticamente dicendo 'leggi fino a che non rimane nulla da leggere', ma c'è altro da leggere finché il socket è aperto, quindi si blocca e aspetta il contenuto in entrata . I server evitano di appendere SEMPRE specificando QUANTO QUANTITÀ di contenuti da leggere. Scusa, avrei dovuto metterlo in primo piano. – smakateer

13

self.rfile.read(int(self.headers.getheader('Content-Length'))) restituirà i dati POST HTTP grezzi come stringa.

scomponendola:

  1. L'intestazione 'Content-Length' specifica quanti byte i dati HTTP POST contiene.
  2. self.headers.getheader('Content-Length') restituisce la lunghezza del contenuto (valore dell'intestazione) come stringa.
  3. Questo deve essere convertito in un numero intero prima di passare come parametro a self.rfile.read(), quindi utilizzare la funzione int().

Si noti inoltre che il nome di intestazione è case sensitive quindi ha da specificare come 'Content-Length' solo.

Edit: A quanto pare campo di intestazione non è case sensitive (almeno in Python 2.7.5), che credo sia il comportamento corretto dal https://tools.ietf.org/html/rfc2616 stati:

Ogni campo di intestazione consiste di un nome seguito da due punti (":") e il valore del campo. I nomi dei campi non fanno distinzione tra maiuscole e minuscole.

+0

Si prega di essere più prolisso, non ho idea di cosa stai suggerendo. –

+1

@jb: ho aggiunto più dettagli alla risposta. Fammi sapere se c'è qualcosa di specifico che deve ancora essere elaborato. –

+0

@SindhuriKuppasad, il nome dell'intestazione non è sensibile al maiuscolo/minuscolo. Le seguenti affermazioni restituiscono entrambi la lunghezza del contenuto nei miei test: 'self.headers.getheader ('content-length')' e 'self.headers.getheader ('content-LENGTH')' – famzah

Problemi correlati