2010-06-10 14 views
6

Ho una funzione di classe per interfacciare con l'API RESTful per Last.FM - il suo scopo è quello di catturare le tracce più recenti per il mio utente. Eccolo:Errore PHP CURL: "Risposta vuota dal server"

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; 
} 

Questo restituisce "Empty reply from server". So che alcuni hanno suggerito che questo errore provenga da un difetto nell'infrastruttura di rete; Non credo che questo sia vero nel mio caso. Se eseguo una richiesta CURL attraverso la riga di comando, ottengo i miei dati; il servizio Last.FM è attivo e accessibile.

Prima di andare a quelle persone e vedere se qualcosa è cambiato, volevo controllare con voi gente e vedere se c'è qualche problema nel mio codice che causerebbe questo.

Grazie!

RISPOSTA: @Jan Kuboschek mi ha aiutato a imbattersi in quello che (forse) sta succedendo qui. Dando CURLOPT_POSTFIELDS a un array associativo, viene specificato un particolare tipo di contenuto che potrebbe non funzionare con determinati servizi RESTful. Una soluzione più intelligente consiste nel creare manualmente una versione con codifica URL di tali dati e passarla come CURLOPT_POSTFIELDS.

Per ulteriori informazioni, check out: http://www.brandonchecketts.com/archives/array-versus-string-in-curlopt_postfields

risposta

10

Un problema comune sono spazi nell'URL - a partire, in mezzo, o finali. Lo hai controllato?

Modifica - per i commenti di seguito, la spaziatura non è il problema.

Ho eseguito il codice e ho avuto lo stesso problema, nessun output di sorta. Ho provato l'URL e con una richiesta GET, il server mi parla. Vorrei fare quanto segue:

  1. Usare il seguente da $ base_url: $ base_url = 'http://ws.audioscrobbler.com/2.0/?user=bachya&period=&api_key=xxx&method=user.getTopTracks';

  2. Rimuovere i campi del post dalla richiesta.

Edit ho spostato il codice di fuori della classe in quanto non ho avuto il riposo e modificato. Il seguente codice è perfetto per me. Se queste modifiche non funzionano per te, suggerisco che il tuo errore è in una funzione diversa.

<?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

Sfortunatamente, non è questo il problema: ho aggiornato il mio post originale per mostrare l'URL ($ base_url) che utilizzo. Grazie comunque. : - \ – ABach

+0

Aggiornato la mia risposta. Fammi sapere se questo ancora non funziona. Non ho potuto testare ulteriormente dal momento che il server mi ha detto che avevo bisogno di una chiave API valida. –

+0

Ok, l'ho provato - sembra che si blocchi ("funziona") un po 'più a lungo. I var eseguono il dump dei risultati di curl_exec e restituiscono 'false' in cambio ... Preferisco non pubblicare la mia chiave API, ma sono abbastanza facili da ottenere. – ABach

7

Il server ha ricevuto la richiesta, ma ha inviato una risposta vuota. Controlla il risultato di curl_getinfo($ch, CURLINFO_HTTP_CODE) per scoprire se il server ha risposto con un codice di errore HTTP.

Aggiornamento: Ok, quindi il server risponde con il codice di stato HTTP 100 Continue. In tal caso, questo dovrebbe risolvere il problema:

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

ho trovato qui: PHP and cURL: Disabling 100-continue header. Spero funzioni!

+0

Var-dumping restituisce '100' - utile, spero? – ABach

+1

Un altro aggiornamento: la soluzione di Jan sopra utilizza GET invece di POST, e come Michał ha sottolineato che è effettivamente meglio per leggere le chiamate API. La roba '100 Continua' non si applica a GET, quindi evita accuratamente il vero problema. Se si desidera accedere anche ai servizi di scrittura, è necessario utilizzare il POST per tali chiamate e provare la risposta. – cygri

+0

Che risolve il mio problema, grazie – StoneHeart

0

Secondo Last.FM API documentation è necessario utilizzare il metodo GET anziché il POST per passare i parametri. Quando ho cambiato POST in GET, ho ricevuto la risposta sulla chiave errata.

+0

Non vedo nulla in quel documento che specifica l'uso richiesto di una richiesta GET nel passaggio dei parametri. Potresti mostrarmi dove? – ABach

+1

"In generale, invierete un parametro di metodo espresso come" package.method "insieme agli argomenti specifici del metodo all'URL di root" "Ad esempio .: http://ws.audioscrobbler.com/2.0/? method = artist.getSimilar & api_key = xxx ... Se si accede a un servizio di scrittura, è necessario inviare la richiesta come richiesta POST HTTP. " –

0

Ed ecco il codice per ottenere informazioni album da Laft.FM anche se l'errore di ritorno:

La funzione:

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; 
} 

Usage:

// 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

Sono arrivato allo stesso problema. Il mio Http_code ha restituito 200 ma la mia risposta era vuota. Ci potrebbero essere molte ragioni per questo come ho vissuto.

--La tua hedaers potrebbero essere errati

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

--Potete potrebbe aver bisogno di inviare dati come campi postali di culr e non collegate alle URL come url? P1 = a1 & p2 = a2

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

Così l'array opzioni sarebbe simile al di sotto

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