So wechseln Sie in PHP CURL von POST zu GET

83

Ich habe versucht, von einer vorherigen Post-Anfrage zu einer Get-Anfrage zu wechseln. Was davon ausgeht, dass es ein Get ist, aber irgendwann einen Beitrag macht.

Ich habe folgendes in PHP versucht:

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

Was vermisse ich?

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

Gnosio
quelle
3
Seien Sie vorsichtig mit Get Anfragen. Google hat Spaß mit ihnen. ;)
NotMe
9
@Chris - Ein Freund entdeckte dies auf die harte Tour, als er eine Website erstellte, die vom Benutzer bereitgestellte Inhalte über GET-Anforderungen verwaltete. Googlebot folgte glücklich allen "Löschen" -Links mit vorhersehbaren Ergebnissen.
Meredith L. Patterson

Antworten:

109

Stellen Sie sicher, dass Sie Ihre Abfragezeichenfolge am Ende Ihrer URL einfügen, wenn Sie eine GET-Anforderung ausführen.

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

// Hier Abfragedaten mit der URL setzen
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;
Bei einem POST übergeben Sie die Daten stattdessen über die Option CURLOPT_POSTFIELDS 
es in der CURLOPT__URL zu übergeben.
-------------------------------------------------- -----------------------

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

// Anforderungsmethode auf POST setzen
curl_setopt ($ ch, CURLOPT_POST, 1);

// Abfragedaten hier mit CURLOPT_POSTFIELDS einstellen
curl_setopt ($ ch, CURLOPT_POSTFIELDS, $ qry_str);

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

Anmerkung aus den curl_setopt()Dokumenten für CURLOPT_HTTPGET(Hervorhebung hinzugefügt):

[Setzen Sie CURLOPT_HTTPGET auf] TRUE, um die HTTP-Anforderungsmethode auf GET zurückzusetzen.
Da GET die Standardeinstellung ist, ist dies nur erforderlich, wenn die Anforderungsmethode geändert wurde.

RC.
quelle
3
Das ist eine ziemlich böse Art, eine Zeitüberschreitung von 51 Sekunden einzustellen!
Jack Goossen
Schöner Fang @JackGoossen!
RC.
55

Fügen Sie dies hinzu, bevor Sie curl_exec ($ curl_handle) aufrufen.

curl_setopt($curl_handle, CURLOPT_CUSTOMREQUEST, 'GET');
Bao Le
quelle
Sorry Schatz, hat bei mir nicht funktioniert. Es gibt nichts zurück. Vielen Dank.
Kamlesh
39

Gelöst: Das Problem liegt hier:

Ich stellte POSTüber beide _CUSTOMREQUESTund _POSTund die _CUSTOMREQUESTwie POSTbeim _POSTUmschalten auf _HTTPGET. Der Server nahm an, dass der Header _CUSTOMREQUESTder richtige war, und kam mit einem 411 zurück.

curl_setopt($curl_handle, CURLOPT_CUSTOMREQUEST, 'POST');
Gnosio
quelle
3

Die CURL-Anforderung ist standardmäßig GET. Sie müssen keine Optionen festlegen, um eine GET CURL-Anforderung zu erstellen.

Albertino Carvalho
quelle
Nicht so hier drüben ... Curl versucht automatisch zu posten.
Marcelo Agimóvel