2012-02-05 8 views
10

Estoy intentando iniciar sesión en un sitio a través de PHP cURL y solo recibo respuestas de "Mala solicitud".PHP cURL Content-Length y Content-Type incorrecto

Jugué con el archivo hosts y lo configuré en mi servidor para verificar qué encabezados de solicitud envía mi buscador y compararlos con los encabezados de solicitud enviados por cURL.

Todo es igual, a excepción de:

Navegador:

Content-Type: application/x-www-form-urlencoded 
Content-Length: 51 

PHP cURL:

Content-Length: 51, 359 
Content-Type: application/x-www-form-urlencoded; boundary=----------------------------5a377b7e6ba7 

ya puse que los valores con este comando, pero todavía envía las cabeceras erróneas :

curl_setopt($this->hCurl, CURLOPT_HTTPHEADER, array(
    'Expect:', 
    'Content-Type: application/x-www-form-urlencoded', 
    'Content-Length: 51' 
)); 

Respuesta

31

No debería tener que establecer la longitud del contenido usted mismo. Si usa cURL para enviar un HTTP POST, calculará la longitud del contenido por usted.

Si configura el valor CURLOPT_POSTFIELDS como una matriz, automáticamente enviará la solicitud como multipart/form-data y usará un límite. Si pasa una cadena, usará application/x-www-form-urlencoded, así que asegúrese de pasar una cadena urlencoded a CURLOPT_POSTFIELDS y no una matriz ya que quiere que form-urlencoded.

Usted necesita hacer esto:

$data = 'name=' . urlencode($value) . '&name2=' . urlencode($value2); 
curl_setopt($this->hCurl, CURLOPT_POSTFIELDS, $data); 

// NOT 

$dataArray = array('name' => 'value', 'name2' => 'value2'); 
curl_setopt($this->hCurl, CURLOPT_POSTFIELDS, $dataArray); 

En cualquier caso, usted no necesita ajustar la longitud del contenido, pero usted tiene que utilizar el primer método para obtener application/x-www-form-urlencoded codificación en el formulario.

Si eso no ayuda, publique todo el código relevante para configurar la solicitud de curl, (todas las opciones y datos que le está pasando) y eso debería ayudar a resolver el problema.

EDIT:

Agregado es un ejemplo que se me ocurrió que funciona (me da inicio de sesión fallidos).

<?php 

$URL_HOME = 'http://ilocalis.com/'; 
$LOGIN_URL = 'https://ilocalis.com/login.php'; 

$ch = curl_init($URL_HOME); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 

$home = curl_exec($ch); 

//echo $home; 

$post = array('username' => 'drew', 'password' => 'testing 123'); 
$query = http_build_query($post); 

curl_setopt($ch, CURLOPT_URL, $LOGIN_URL); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $query); 

$login = curl_exec($ch); 

echo $login; 
+1

Gracias por su comentario, no sabía que hay una diferencia entre pasar una matriz y pasar una cadena. Pero http_build_query ($ array) debería funcionar también, ¿no? De todos modos, tampoco funcionó, desafortunadamente. Cuando no especifico la longitud del contenido yo mismo, la página devuelve un error de "Error de HTTP 411 de longitud requerida". Intento iniciar sesión en http://ilocalis.com/ (publicar en https://ilocalis.com/login.php). Si quiere probarlo usted mismo, no necesita una cuenta porque incluso no llegues al punto de cargar la página y verificar si las credenciales dadas fueron correctas ... ¡Gracias! – Simon

+0

Dado que la longitud del contenido no se estableció, me pregunto si el método de solicitud no es POST, o tal vez alguna otra opción está anulando eso. En cualquier caso, actualicé la publicación con un ejemplo de trabajo. Espero que te lleve por el camino correcto. Utiliza 1 objeto curl para hacer 2 solicitudes por separado. Tenga en cuenta que, si necesita realizar una consulta GET nuevamente, debe volver a configurar CURLOPT_POST en 0. – drew010

+0

Gracias. tú. asi que. mucho. No vi el bosque por los árboles. Establecí curlopt_customrequest en "POST" porque solía pasar una matriz a curlopt_postfields ..... Con el uso de una cadena como ya mencionaste debería funcionar, pero me olvidé por accidente de eliminar la cuestión de la petición personalizada. Son las cosas pequeñas las que se vuelven locas. la mierda de nosotros programadores cuando no entiendo por qué no va a funcionar ...;) – Simon