En ocasiones curl devuelve cadena vacía al enviar peticiones POST

Ayer estuve mosqueado con un problema que me daba curl a la hora en enviar peticiones post con php.

Mi aplicación se conectaba a una api que me devolvía un resultado en json, pero en lugar de eso me devolvía una cadena vacía a menos que fallase la autenticación. Lo que me mosqueaba es que sólo fallaba con peticiones POST y no con peticiones GET.

Examinando las cabeceras HTTP de respuesta se mostraba un error indicado como “HTTP/1.1 417 Expectation Failed Connection: close Content-Length: 0

La solución al problema es enviar el campo Expect (vale con mandarlo vacío) dentro de las cabeceras http de la petición, por ejemplo:


$ch = curl_init();

//metemos el campo expect en la cabeceras

curl_setopt( $ch,

CURLOPT_HTTPHEADER,

$headers = array( "Expect:")

);

Sobre Asier

Arquitecto web enganchado al desarrollo, estudio y planteamiento de proyectos en internet. Trabajo en Blackslot, empresa que fundé en el 2009. Me encanta el cine, el café, el sexo, la cultura geek, la cultura oriental y la música electrónica.
Artículo publicado en Desarrollo Web, PHP. Enlace a esta entrada..

6 espuestas a En ocasiones curl devuelve cadena vacía al enviar peticiones POST

  1. Javi dijo:

    A mí también me ocurría este problema. Tu solución me funciona perfectamente.

  2. Jose Juan dijo:

    Hola Asier y Javi,

    Llevo 3 dias peleandome 24 horas con este tema y no consigo sacar nada. Mi caso es el mismo que el tuyo, Asier. Tengo un aplicacion actionscript que se conecta a mi API php, que utiliza CURL para conexiones http. Pues bien, la hij** d* p**$!! se conecta de cada 10 veces, 1 o ninguna, y el resto son cadenas vacias. ME he vuelto loco y no me funciona nada de lo que leo por los foros, tambien lo vuestro lo probe y nada… Este es mi codigo, podeis ayudarme por favor?

    $options = array(
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => “”,
    CURLOPT_USERAGENT => “spider”,
    CURLOPT_AUTOREFERER => true,
    CURLOPT_CONNECTTIMEOUT => 120,
    CURLOPT_TIMEOUT => 120,
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_HTTPHEADER => array(“Expect:”),
    );

    $ch = curl_init( $url );
    curl_setopt_array( $ch, $options );
    $content = curl_exec( $ch );
    $err = curl_errno( $ch );
    $errmsg = curl_error( $ch );
    $header = curl_getinfo( $ch );
    curl_close( $ch );

    $header['errno'] = $err;
    $header['errmsg'] = $errmsg;
    $header['content'] = trim($content);
    $this->vsResult = $header;

  3. Asier Marqués dijo:

    Hola Jose Juan,

    Ponle el CURLOPT_HEADER a true es decir…

    curl_setopt ($ch , CURLOPT_HEADER, true);

    a ver que cabecera te retorna la respuesta al hacer el curl_exec, tiene que retornarte algun error ahí.

    ¿Qué servidor web usas? Lighttpd, nginx, apache, iis?

  4. Jose Juan dijo:

    Hola Asier,

    Lo primero, muchas gracias por contestar y tan pronto. Espero que comprendas el dolor de cabeza de este tema, ya que te paso algo parecido a ti tambien.

    Lo segundo. Es muy dificil que obtenga respuesta, incluso con el HEADER a true. Pero bueno, alguna vez que otra sale algo asi:

    HTTP/1.1 200 OK
    X-Powered-By: Servlet/2.5
    Server: Sun Java System Application Server 9.1_01
    Content-Type: application/xml
    Content-Length: 130
    Date: Mon, 27 Apr 2009 11:04:17 GMT

    … y fin de la historia…

    Alguna que otra vez me indica que el contenido este “chuncked” no se si eso influye…

    Un saludo y gracias

  5. Jose Juan dijo:

    LAnzando la URL en el navegador funciona correctamente. Desde mi ordenador este codigo tambien funciona correctamente, lo que me llevaba a pensar que es cosa de algun firewall, pero no, porque a otras urls de este mismo site se conecta sin problemas.

    Y lo mas divertido: si le paso algun parametro INCORRECTO, me da error de servidor diciendome que el parametro tiene un valor incorrecto y etc, todo como debe ser, pero si le paso valores todos correctos, entonces la respuesta solo me llega de vez en cuando…

    Osea, para fallar, falla bien, pero para funcionar, solo me funciona una vez de 10. Dios que he hecho yo para merecer esto :’(

  6. MM no sera que al api que haces la peticion te pide parametros como el ID o el nombre por eso te lo regresa vacios en el post, pues por que esos valores bienen “vacios”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos requeridos, están marcados *

*

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Notificarme los nuevos comentarios por correo electrónico. Tambien puedes suscribirte sin comentar.