2012-04-30 18 views
8

Ive ha ottenuto un codicerichiesta Curl con le intestazioni - un corpo separato da un colpo di testa

$ch = curl_init($url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_HEADER, 1);   
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); 
    $ret = curl_exec($ch); 
    $responseCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
    curl_close($ch); 

Ora voglio per estrarre il corpo da $ ret, senza intestazioni. Qualche idea su come farlo?

risposta

18

ne dite di questo:

list($headers, $content) = explode("\r\n\r\n", $ret, 2); 

... che dovrebbe dare il corpo della tua richiesta nella variabile $ content?

+8

Questo errore quando HTTP/1.1. Esistono 100 intestazioni continue. – sivann

+5

È possibile rimuovere l'intestazione continua con 'curl_setopt ($ ch, CURLOPT_HTTPHEADER, array ('Expect:'));'. –

+3

Anche questo non è valido quando si utilizza CURLOPT_FOLLOWLOCATION e viene recuperato un indirizzo con un reindirizzamento 301 o 302. –

32

La risposta di raina77ow è buona. Dai commenti sembra che ci siano alcune condizioni che potrebbero far sì che "esplodere" non funzioni. Ho trovato un modo che funziona meglio per me e ho pensato di condividere.

Chiamando curl_getinfo ($ ch, CURLINFO_HEADER_SIZE) è possibile ottenere la lunghezza dell'intestazione della risposta. Così ho fatto quanto segue:

// Original Code 
$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_HEADER, 1);   
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); 
$ret = curl_exec($ch); 
$responseCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 

// Added Code 
$header_len = curl_getinfo($ch, CURLINFO_HEADER_SIZE); 
$header = substr($ret, 0, $header_len); 
$body = substr($ret, $header_len); 

// Back to Original Code 
curl_close($ch); 

Questo funziona perfettamente per me. Spero che aiuti qualcun altro.

+0

Funzionando perfetto! – BornToDrink

+0

Sembra che 'CURLOPT_BINARYTRANSFER' non faccia più nulla. [vedi questa domanda SO] (http://stackoverflow.com/questions/6007363/what-does-curlopt-binarytranfer-exactly-mean) – jxmallett

+0

Risposta perfetta ... finalmente sono stato salvato da quei brutti script che si sono appena separati di '\ n \ n' – leedch

1

Attingendo @Geoffrey eccellente risposta in this thread ...

Alcuni degli altri soluzioni offerte questa discussione sono non fare questo in modo corretto.

  • Splitting su \r\n\r\n non è affidabile quando CURLOPT_FOLLOWLOCATION è acceso o quando il server risponde con un codice 100.
  • Rilevare la dimensione delle intestazioni tramite CURLINFO_HEADER_SIZE non è sempre affidabile, soprattutto quando vengono utilizzati i proxy o in alcuni degli stessi scenari di reindirizzamento.

Il metodo più affidabile per ottenere le intestazioni utilizza CURLOPT_HEADERFUNCTION. Quindi puoi rimuovere curl_setopt($ch, CURLOPT_HEADER, 1); e il tuo corpo sarà pulito senza intestazioni.

Ecco un metodo molto pulito per eseguire questo utilizzando chiusure PHP. Converte anche tutte le intestazioni in lettere minuscole per una gestione coerente tra server e versioni HTTP.

$ch = curl_init(); 
$headers = []; 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

// Run the following function for each header received 
// Note: Does NOT handle multiple instances of the same header. Later one will overwrite. 
//  Consider handling that scenario if you need it. 
curl_setopt($ch, CURLOPT_HEADERFUNCTION, function($curl, $header) use (&$headers) { 
    $len = strlen($header); 
    $header = explode(':', $header, 2); 
    if (count($header) >= 2) 
     $headers[strtolower(trim($header[0]))] = trim($header[1]); 
    return $len; 
}); 

$data = curl_exec($ch); 
print_r($headers); 
+1

Questo dovrebbe essere un commento, non una risposta. Se si tratta di una domanda duplicata, [vota per chiudere] (http://stackoverflow.com/help/privileges/close-questions) in quanto tale. In caso contrario, adattare la risposta a questa domanda specifica. –

Problemi correlati