2009-08-04 23 views
63

Ho provato a passare da una precedente richiesta di posta a una richiesta di ottenere. Che presuppone un Get ma alla fine fa un post.Come passare da POST a GET in PHP CURL

Ho provato quanto segue in PHP:

curl_setopt($curl_handle, CURLOPT_POSTFIELDS, null); 
curl_setopt($curl_handle, CURLOPT_POST, FALSE); 
curl_setopt($curl_handle, CURLOPT_HTTPGET, TRUE); 

Che cosa mi manca?

Ulteriori informazioni: Ho già una connessione configurata per eseguire una richiesta POST. Questo si conclude con successo, ma più avanti quando cerco di riutilizzare la connessione e tornare a GET usando il setopts sopra, si finisce comunque per fare un POST internamente con intestazioni POST incomplete. Il problema è che crede che stia facendo un GET ma finisce col mettere un'intestazione POST senza il parametro content-length e la connessione fallisce con un errore 411.

+3

Prestare attenzione alle richieste Get. Google si diverte con loro. ;) – NotMe

+8

@Chris - un amico ha scoperto che è difficile quando ha creato un sito che gestiva i contenuti forniti dagli utenti tramite le richieste GET. Googlebot ha seguito felicemente tutti i link "Elimina", con risultati prevedibili. –

risposta

28

risolto: Il problema è qui:

I set POST via sia _CUSTOMREQUEST e _POST e la _CUSTOMREQUEST persistette come POST mentre _POST commutato _HTTPGET. Il server ha assunto il colpo di testa da _CUSTOMREQUEST essere quella giusta e tornò con un 411.

curl_setopt($curl_handle, CURLOPT_CUSTOMREQUEST, 'POST'); 
86

Assicurati di inserire la stringa di query alla fine dell'URL quando esegui una richiesta GET.

 
$qry_str = "?x=10&y=20"; 
$ch = curl_init(); 

// Set query data here with the URL 
curl_setopt($ch, CURLOPT_URL, 'http://example.com/test.php' . $qry_str); 

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_TIMEOUT, 3); 
$content = trim(curl_exec($ch)); 
curl_close($ch); 
print $content; 
 
With a POST you pass the data via the CURLOPT_POSTFIELDS option instead 
of passing it in the CURLOPT__URL. 
------------------------------------------------------------------------- 

$qry_str = "x=10&y=20"; 
curl_setopt($ch, CURLOPT_URL, 'http://example.com/test.php'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_TIMEOUT, 3); 

// Set request method to POST 
curl_setopt($ch, CURLOPT_POST, 1); 

// Set query data here with CURLOPT_POSTFIELDS 
curl_setopt($ch, CURLOPT_POSTFIELDS, $qry_str); 

$content = trim(curl_exec($ch)); 
curl_close($ch); 
print $content; 

Nota della curl_setopt() docs per CURLOPT_HTTPGET (enfasi aggiunta):

[Set CURLOPT_HTTPGET pari a] TRUE-ripristinare il metodo di richiesta HTTP GET.
Poiché GET è il valore predefinito, questo è necessario solo se il metodo di richiesta è stato modificato.

+0

Questo è un modo piuttosto malvagio per impostare un timeout di 51 secondi! –

+0

Nice catch @JackGoossen! –

39

Aggiungere questo prima di chiamare curl_exec ($ curl_handle) richiesta

curl_setopt($curl_handle, CURLOPT_CUSTOMREQUEST, 'GET'); 
2

CURL di default è GET, è non è necessario impostare alcuna opzione per effettuare una richiesta GET CURL.

+0

Non da questa parte ... arricciatura sta tentando di postare automaticamente. –