2010-06-10 18 views
6

Ich habe eine Klassenfunktion, die Schnittstelle mit der RESTful API für Last.FM - Zweck ist es, die neuesten Tracks für meinen Benutzer zu greifen. Hier ist es:PHP CURL Fehler: "Leere Antwort vom 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; 
} 

Dies gibt "Empty reply from server" zurück. Ich weiß, dass einige meinen, dass dieser Fehler auf einen Fehler in der Netzwerkinfrastruktur zurückzuführen ist. Ich glaube nicht, dass dies in meinem Fall zutrifft. Wenn ich eine cURL-Anfrage über die Kommandozeile abspiele, bekomme ich meine Daten; Der Last.FM-Dienst ist verfügbar und verfügbar.

Bevor ich zu diesen Leuten gehe und sehe, ob sich etwas geändert hat, wollte ich mit Ihnen nette Leute überprüfen und sehen, ob es ein Problem in meinem Code gibt, das dies verursachen würde.

Danke!

ANTWORT: @Jan Kuboschek half mir dabei zu stolpern, was (vielleicht) hier vor sich geht. Wenn Sie CURLOPT_POSTFIELDS ein assoziatives Array angeben, wird ein bestimmter Inhaltstyp angegeben, der möglicherweise nicht mit bestimmten RESTful-Diensten funktioniert. Eine intelligentere Lösung besteht darin, eine URL-codierte Version dieser Daten manuell zu erstellen und diese als CURLOPT_POSTFIELDS weiterzugeben.

Weitere Informationen finden Sie unter: http://www.brandonchecketts.com/archives/array-versus-string-in-curlopt_postfields

Antwort

10

Ein häufiges Problem sind Leerzeichen in der URL - beginnend in der Mitte, oder nachgestellte. Hast du das überprüft?

Bearbeiten - nach den Kommentaren unten ist der Abstand nicht das Problem.

Ich lief Ihren Code und hatte das gleiche Problem - keine Ausgabe überhaupt. Ich habe versucht, die URL und mit einer GET-Anfrage, der Server spricht mit mir. Ich würde Folgendes tun:

  1. Verwenden Sie das folgende wie $ base_url: $ base_url = 'http://ws.audioscrobbler.com/2.0/?user=bachya&period=&api_key=xxx&method=user.getTopTracks';

  2. Entfernen Sie die Postfelder von Ihrer Anfrage.

bearbeiten zog ich den Code der Klasse aus, da ich nicht den Rest hatte und es verändert. Der folgende Code läuft perfekt für mich. Wenn diese Änderungen für Sie nicht funktionieren, schlage ich vor, dass Ihr Fehler in einer anderen Funktion ist.

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

Leider ist das nicht das Problem - ich habe meinen ursprünglichen Beitrag aktualisiert, um die URL ($ base_url) anzuzeigen, die ich verwende. Trotzdem danke. : - \ – ABach

+0

Meine Antwort wurde aktualisiert. Lass es mich wissen, wenn das immer noch nicht funktioniert. Ich konnte nicht weiter testen, da der Server mir sagte, dass ich einen gültigen API-Schlüssel brauchte. –

+0

Okay, versuchte das - es scheint ein wenig länger zu hängen ("arbeiten"). Ich var dump die curl_exec Ergebnisse und bekomme 'falsch' im Gegenzug ... Ich würde lieber nicht meine API-Schlüssel, aber sie sind leicht genug zu bekommen. – ABach

7

Der Server hat Ihre Anfrage erhalten, aber eine leere Antwort gesendet. Überprüfen Sie das Ergebnis von curl_getinfo($ch, CURLINFO_HTTP_CODE), um herauszufinden, ob der Server mit einem HTTP-Fehlercode geantwortet hat.

Update: Ok, so antwortet der Server mit dem HTTP-Statuscode 100 Continue. In diesem Fall sollte das Ihr Problem lösen:

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

ich das hier gefunden: PHP and cURL: Disabling 100-continue header. Hoffe, es funktioniert!

+0

Var-Dumping das gibt '100' zurück - hilfreich, hoffe ich? – ABach

+1

Noch ein Update: Jans obige Lösung verwendet GET anstelle von POST, und wie Micha³ darauf hingewiesen hat, ist das eigentlich besser für Lese-API-Aufrufe. Das '100 Continue'-Zeug gilt nicht für GET, so dass es das eigentliche Problem sauber vermeidet. Wenn Sie auch auf Schreibdienste zugreifen möchten, sollten Sie für diese Anrufe POST verwenden und meine Antwort versuchen. – cygri

+0

Das löst mein Problem, danke – StoneHeart

0

Nach Last.FM API documentation Sie sollten GET-Methode anstelle von POST verwenden Parameter zu übergeben. Wenn ich POST geändert haben GET ich die Antwort über falsche Schlüssel erhalten.

+0

Ich sehe nichts in diesem Dokument, das die erforderliche Verwendung einer GET-Anfrage bei der Übergabe von Parametern angibt. Kannst du mir zeigen wo? – ABach

+1

"Im Allgemeinen senden Sie einen Methodenparameter, ausgedrückt als 'package.method', zusammen mit methodspezifischen Argumenten an die Root-URL" http://www.audioscrobbler.com/2.0/? method = artist.getSimilar & api_key = xxx ... Wenn Sie auf einen Schreibservice zugreifen, müssen Sie Ihre Anfrage als HTTP-POST-Anfrage senden. " –

0

Und hier ist der Code für bekommen Album Info von Laft.FM auch wenn Rückkehr Fehler:

Die Funktion:

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

Verbrauch:

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

Ich kam das gleiche Problem. Mein Http_code gab 200 zurück, aber meine Antwort war leer. Es könnte viele Gründe dafür geben, wie ich es erlebt habe.

--Euer hedaers könnte

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

--Sie müssen möglicherweise Daten als Post Felder in culr senden und nicht an die URL wie url? P1 = a1 & p2 = a2 falsch

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

So Ihre Optionen Array würde unter

auf die ähnlich sein
Verwandte Themen