Cómo cambiar de POST a GET en PHP CURL

83

He intentado cambiar de una solicitud de publicación anterior a una solicitud de obtención. Lo que asume que es un Get pero eventualmente hace una publicación.

Probé lo siguiente en PHP:

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

¿Qué me estoy perdiendo?

Información adicional: ya tengo una conexión configurada para realizar una solicitud POST. Eso se completa con éxito, pero más tarde, cuando intento reutilizar la conexión y volver a GET usando los setopts anteriores, todavía termina haciendo un POST internamente con encabezados POST incompletos. El problema es que cree que está haciendo un GET pero termina colocando un encabezado POST sin el parámetro content-length y la conexión falla con un ERROR 411.

gnosio
fuente
3
Tenga cuidado con las solicitudes de obtención. Google se divierte con ellos. ;)
NotMe
10
@Chris: un amigo descubrió eso de la manera más difícil cuando creó un sitio que administraba contenido aportado por los usuarios a través de solicitudes GET. Googlebot siguió felizmente todos los enlaces de 'eliminar', con resultados predecibles.
Meredith L. Patterson

Respuestas:

109

Asegúrese de poner su cadena de consulta al final de su URL cuando realice una solicitud GET.

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

// Establezca aquí los datos de la consulta con la 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);
$ contenido = recortar (curl_exec ($ ch));
curl_close ($ ch);
imprimir $ contenido;
Con un POST, pasa los datos a través de la opción CURLOPT_POSTFIELDS en su lugar 
de pasarlo en el 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);

// Establecer el método de solicitud en POST
curl_setopt ($ ch, CURLOPT_POST, 1);

// Establezca aquí los datos de la consulta con CURLOPT_POSTFIELDS
curl_setopt ($ ch, CURLOPT_POSTFIELDS, $ qry_str);

$ contenido = recortar (curl_exec ($ ch));
curl_close ($ ch);
imprimir $ contenido;

Nota de los curl_setopt()documentos para CURLOPT_HTTPGET(énfasis agregado):

[Establezca CURLOPT_HTTPGET igual a] TRUEpara restablecer el método de solicitud HTTP a GET.
Dado que GET es el valor predeterminado, esto solo es necesario si se ha cambiado el método de solicitud.

RC.
fuente
3
¡Esa es una forma bastante malvada de establecer un tiempo de espera de 51 segundos!
Jack Goossen
Buen partido @JackGoossen!
RC.
55

Agregue esto antes de llamar a curl_exec ($ curl_handle)

curl_setopt($curl_handle, CURLOPT_CUSTOMREQUEST, 'GET');
Bao Le
fuente
39

Resuelto: el problema radica aquí:

Configuré a POSTtravés de ambos _CUSTOMREQUESTy _POSTy el _CUSTOMREQUESTpersistió como POSTmientras _POSTcambiaba a _HTTPGET. El servidor asumió que el encabezado de _CUSTOMREQUESTera el correcto y regresó con un 411.

curl_setopt($curl_handle, CURLOPT_CUSTOMREQUEST, 'POST');
gnosio
fuente
3

La solicitud CURL de forma predeterminada es GET, no es necesario configurar ninguna opción para realizar una solicitud GET CURL.

Albertino Carvalho
fuente