2009-08-04 10 views
63

Ich habe versucht, von einer früheren Post-Anfrage auf eine Get-Anfrage zu wechseln. Das geht davon aus ein Get zu bekommen, macht aber letztendlich einen Post.Wie von POST zu GET in PHP wechseln CURL

habe ich versucht, die folgenden in PHP:

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

Was bin ich?

Zusätzliche Informationen: Ich habe bereits eine Verbindung, die eingerichtet ist, eine POST-Anfrage zu machen. Das wird erfolgreich abgeschlossen, aber später, wenn ich versuche, die Verbindung wiederzuverwenden und mit den obigen setopts zurück zu GET zu wechseln, wird immer noch ein POST intern mit unvollständigen POST-Headern ausgeführt. Das Problem ist, dass es glaubt, dass es ein GET tut, aber am Ende einen POST-Header ohne den content-length-Parameter setzt und die Verbindung mit einem 411 ERROR fehlschlägt.

+3

Seien Sie vorsichtig mit Anfragen erhalten. Google hat Spaß mit ihnen. ;) – NotMe

+8

@Chris - ein Freund hat das auf die harte Tour entdeckt, als er eine Site aufgebaut hat, die User-Content über GET-Requests verwaltet. Der Googlebot verfolgt alle Links zum Löschen mit vorhersehbaren Ergebnissen. –

Antwort

28

Gelöst: Das Problem liegt hier:

Ich habe POST sowohl über _CUSTOMREQUEST und _POST und die _CUSTOMREQUEST blieb als POST während _POST-_HTTPGET geschaltet. Der Server übernahm die Header von _CUSTOMREQUEST das richtige zu sein und kam mit einem dieser 411.

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

Stellen Sie sicher, dass Sie Ihre Abfragezeichenfolge am Ende Ihrer URL platzieren, wenn Sie eine GET-Anfrage ausführen.

 
$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; 

Hinweis vom curl_setopt() docs für CURLOPT_HTTPGET (Hervorhebung hinzugefügt):

[Set CURLOPT_HTTPGET gleich] TRUE-zurückgesetzt die HTTP-Request-Methode zu erhalten.
Da GET der Standardwert ist, ist dies nur erforderlich, wenn die Anforderungsmethode geändert wurde.

+0

Das ist ein ziemlich böser Weg, um eine Auszeit von 51 Sekunden zu setzen! –

+0

Schöner Fang @JackGoossen! –

39

hinzufügen vor curl_exec ($ curl_handle)

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

ROTATION Anfrage standardmäßig Aufruf ist GET, Sie Sie müssen keine Optionen festlegen, um eine GET CURL-Anfrage zu stellen.

+0

Nicht so hier drüben ... curl versucht automatisch zu posten. –