2010-06-10 23 views
6

Tengo una función de clase para interactuar con la API RESTful para Last.FM - su propósito es obtener las pistas más recientes para mi usuario. Aquí está:Error PHP cURL: "Respuesta vacía del servidor"

private static $base_url = 'http://ws.audioscrobbler.com/2.0/'; 

public static function getTopTracks($options = array()) 
{ 
    $options = array_merge(array(
    'user' => 'bachya', 
    'period' => NULL, 
    'api_key' => 'xxxxx...', // obfuscated, obviously 
), $options); 

    $options['method'] = 'user.getTopTracks'; 

    // Initialize cURL request and set parameters 
    $ch = curl_init(); 
    curl_setopt_array($ch, array(
    CURLOPT_URL   => self::$base_url, 
    CURLOPT_POST   => TRUE, 
    CURLOPT_POSTFIELDS  => $options, 
    CURLOPT_RETURNTRANSFER => TRUE, 
    CURLOPT_TIMEOUT  => 30, 
    CURLOPT_USERAGENT  => 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)' 
)); 

    $results = curl_exec($ch); 
    return $results; 
} 

Esto devuelve "Empty reply from server". Sé que algunos han sugerido que este error proviene de algún fallo en la infraestructura de la red; No creo que esto sea cierto en mi caso. Si ejecuto una solicitud de cURL a través de la línea de comando, obtengo mis datos; el servicio Last.FM está activo y accesible.

Antes de ir con esa gente y ver si algo ha cambiado, quería consultar con ustedes y ver si hay algún problema en mi código que podría estar causando esto.

Gracias!

RESPUESTA: @ Jan Kuboschek me ayudó a darme cuenta de lo que está (tal vez) sucediendo aquí. Al proporcionar CURLOPT_POSTFIELDS una matriz asociativa, se especifica un tipo de contenido particular que puede no funcionar con ciertos servicios RESTful. Una solución más inteligente es crear manualmente una versión con codificación URL de esa información y pasarla como CURLOPT_POSTFIELDS.

Para obtener más información, echa un vistazo a: http://www.brandonchecketts.com/archives/array-versus-string-in-curlopt_postfields

Respuesta

10

Un problema común son espacios en la URL - comenzando, en el medio, o al final. ¿Lo revisaste?

Editar - por los comentarios a continuación, el espaciamiento no es el problema.

Ejecuté su código y tuve el mismo problema, sin salida alguna. Probé la URL y con una solicitud GET, el servidor me habla. Me gustaría hacer lo siguiente:

  1. Use lo siguiente como $ base_url: $ base_url = 'http://ws.audioscrobbler.com/2.0/?user=bachya&period=&api_key=xxx&method=user.getTopTracks';

  2. Elimina los campos de publicación de tu solicitud.

Editar I movido el código de la clase ya que no tengo el resto y lo modificó. El siguiente código funciona perfecto para mí. Si estos cambios no funcionan para usted, le sugiero que su error esté en una función diferente.

<?php 


function getTopTracks() 
{ 
    $base_url = 'http://ws.audioscrobbler.com/2.0/?user=bachya&period=&api_key=8066d2ebfbf1e1a8d1c32c84cf65c91c&method=user.getTopTracks'; 
    $options = array_merge(array(
    'user' => 'bachya', 
    'period' => NULL, 
    'api_key' => 'xxxxx...', // obfuscated, obviously 
)); 

    $options['method'] = 'user.getTopTracks'; 

    // Initialize cURL request and set parameters 
    $ch = curl_init($base_url); 
    curl_setopt_array($ch, array(
    CURLOPT_URL   => $base_url, 
    CURLOPT_RETURNTRANSFER => TRUE, 
    CURLOPT_TIMEOUT  => 30, 
    CURLOPT_USERAGENT  => 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)' 
)); 

    $results = curl_exec($ch); 
    return $results; 
} 

echo getTopTracks(); 

?> 
+0

Lamentablemente, ese no es el problema: actualicé mi publicación original para mostrar la URL ($ base_url) que uso. Gracias, sin embargo. : - \ – ABach

+0

Actualicé mi respuesta. Avísame si esto aún no funciona. No pude probar más ya que el servidor me dijo que necesitaba una clave API válida. –

+0

De acuerdo, lo intenté, parece colgarse ("trabajar") un poco más. I var volcar los resultados de curl_exec y obtener 'falso' a cambio ... Prefiero no sacar mi clave de API, pero son lo suficientemente fáciles de obtener. – ABach

7

El servidor recibió su solicitud, pero envió una respuesta vacía. Compruebe el resultado de curl_getinfo($ch, CURLINFO_HTTP_CODE) para averiguar si el servidor respondió con un código de error HTTP.

Actualización: Ok, el servidor responde con el código de estado HTTP 100 Continue. En ese caso, esto debería resolver su problema:

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:')); 

encontré esta aquí: PHP and cURL: Disabling 100-continue header. ¡Espero que funcione!

+0

Var-dumping esto devuelve '100' - útil, espero? – ABach

+1

Una actualización más: la solución de Jan anterior utiliza GET en lugar de POST, y como Michał señaló que en realidad es mejor para las llamadas de API leídas. La función '100 Continue' no se aplica a GET, por lo que evita claramente el problema real. Si también desea acceder a los servicios de escritura, debe usar POST para esas llamadas y probar mi respuesta. – cygri

+0

Eso soluciona mi problema, gracias – StoneHeart

0

De acuerdo con Last.FM API documentation debe utilizar el método GET en lugar de POST para pasar los parámetros. Cuando cambié POST por GET, recibí la respuesta sobre la clave incorrecta.

+0

No veo nada en ese documento que especifique el uso requerido de una solicitud GET para pasar los parámetros. ¿Podrías mostrarme dónde? – ABach

+1

"En general, enviará un parámetro de método expresado como 'package.method' junto con argumentos específicos del método al URL raíz" "Por ejemplo .: http://ws.audioscrobbler.com/2.0/? method = artist.getSimilar & api_key = xxx ... Si está accediendo a un servicio de escritura, deberá enviar su solicitud como una solicitud HTTP POST ". –

0

Y aquí está el código para obtener información del álbum de Laft.FM incluso si el error de retorno:

La Función:

function getAlbum($xml,$artist,$album) 
{ 
    $base_url = $xml; 
    $options = array_merge(array(
    'user' => 'YOUR_USERNAME', 
    'artist'=>$artist, 
    'album'=>$album, 
    'period' => NULL, 
    'api_key' => 'xYxOxUxRxxAxPxIxxKxExYxx', 
)); 

    $options['method'] = 'album.getinfo'; 

    // Initialize cURL request and set parameters 
    $ch = curl_init($base_url); 
    curl_setopt_array($ch, array(
    CURLOPT_URL   => 'http://ws.audioscrobbler.com/2.0/', 
    CURLOPT_POST   => TRUE, 
    CURLOPT_POSTFIELDS  => $options, 
    CURLOPT_RETURNTRANSFER => TRUE, 
    CURLOPT_TIMEOUT  => 30, 
    CURLOPT_HTTPHEADER  => array('Expect:') , 
    CURLOPT_USERAGENT  => 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)' 
)); 

    $results = curl_exec($ch); 
    unset ($options); 
    return $results; 
} 

Uso:

// Get the XML 
$xml_error = getAlbum($xml,$artist,$album); 

// Show XML error 
if (preg_match("/error/i", $xml_error)) { 
    echo " <strong>ERRO:</strong> ".trim(strip_tags($xml_error)); 
} 
0

Vine acorss el mismo problema. Mi Http_code devolvió 200 pero mi respuesta estaba vacía. Podría haber muchas razones para esto como lo experimenté.

--Tu hedaers podrían ser incorrectos

CURLOPT_HTTPHEADER => array('Content-Type:application/json', 'Expect:') 

--Usted podría necesitar enviar datos como campos de correos en CULR y no unidos a la URL como url? P1 = a1 = a2 & p2

$data = array (p1=>a1, p2=>a2) 
CURLOPT_POSTFIELDS => $data 

Así la matriz de opciones sería similar a la de abajo

array(
    CURLOPT_URL => $url, 
    CURLOPT_FAILONERROR => TRUE, // FALSE if in debug mode 
    CURLOPT_RETURNTRANSFER => TRUE, 
    CURLOPT_TIMEOUT => 4, 
    CURLOPT_HTTPHEADER => array('Content-Type:application/json', 'Expect:'), 
    CURLOPT_POST => TRUE, 
    CURLOPT_POSTFIELDS => $data, 
); 
Cuestiones relacionadas