8
votes

Erreur de CURL PHP: "Réponse vide du serveur"

J'ai une fonction de classe pour interfacer avec l'API reposante pour last.fm - son but est de saisir le plus pistes récentes pour mon utilisateur. Ici, c'est le cas:

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


0 commentaires

5 Réponses :


12
votes

Un problème commun sont des espaces dans l'URL - début, au milieu ou à la traînée. Avez-vous vérifié cela?

edit - par commentaires ci-dessous, l'espacement n'est pas le problème.

J'ai couru votre code et j'ai eu le même problème - aucune sortie. J'ai essayé l'URL et avec une demande d'obtention, le serveur me parle. Je ferais ce qui suit:

  1. Utilisez ce qui suit comme $ base_url: $ base_url = ' http://w.audioscrobbler.com/2.0/?user=bachya&period=&api_key=xxx&method=user.gettoptracks ';

  2. Supprimez les champs de poste de votre demande.

    edit J'ai déplacé votre code de la classe depuis que je n'avais pas le reste et je l'ai modifié. Le code suivant fonctionne parfaitement pour moi. Si ces modifications ne fonctionnent pas pour vous, je suggère que votre erreur soit dans une fonction différente. xxx


7 commentaires

Malheureusement, ce n'est pas le problème - j'ai mis à jour mon message d'origine pour montrer l'URL ($ base_url) que j'utilise. Merci quand même. : - \


Mise à jour ma réponse. Faites-moi savoir si cela ne fonctionne toujours pas. Je ne pouvais pas tester plus loin depuis que le serveur m'a dit que j'avais besoin d'une clé API valide.


D'accord, j'ai essayé ça - il semble suspendre ("travail") un peu plus longtemps. I Var Dump the Curl_Exec Résultats et obtenez False en retour ... Je préfère ne pas mettre ma clé API, mais ils sont assez faciles à obtenir.


Ok, ça me dérange maintenant. Comment puis-je obtenir une clé API?


Vérifiez ici: Last.fm/api/Account - Merci d'être aussi buggé que je suis! :)


Ok, vous frappez quelque chose que j'ai mis à jour mon message original avec. Merci de votre aide! :)


J'avais le même problème .. Infact Space crée des problèmes avec la demande de courbure. J'avais Keyowrd = iPhone 5 dans mon URL et j'avais toujours une réponse vide .. Quand j'ai remplacé Keyowrd = iPhone + 5, ça a fonctionné bien :)



8
votes

Le serveur a reçu votre demande, mais envoyé une réponse vide. Vérifiez le résultat de curl_getinfo ($ ch, curlinfo_http_code) code> Pour savoir si le serveur a répondu avec un code d'erreur HTTP.

update: strong> ok afin que le serveur réponde avec le serveur. 100 Continuer code> code d'état HTTP. Dans ce cas, cela devrait résoudre votre problème: P>

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


2 commentaires

Var-Dumping this renvoie 100 - utile, j'espère?


Une mise à jour de plus: la solution de Jan ci-dessus utilise-t-elle au lieu de poster, et comme Michał a souligné que c'est mieux mieux pour lire les appels API. Le 100 Continuer ne s'applique pas pour obtenir, donc il évite parfaitement le vrai problème. Si vous souhaitez accéder également aux services d'écriture, vous devez utiliser POST pour ces appels et essayer ma réponse.



0
votes

Selon Last.fm Documentation API Vous devez utiliser GET méthode au lieu de poster pour passer des paramètres. Quand j'ai changé de message pour obtenir, j'ai reçu la réponse sur une clé incorrecte.


2 commentaires

Je ne vois rien dans ce document qui spécifie l'utilisation requise d'une demande d'obtention de paramètres de passage. Pourriez-vous me montrer où?


"En règle générale, vous enverrez un paramètre de méthode exprimé comme" package.method "avec des arguments spécifiques à la méthode à l'URL racine" "par exemple: ws.audioscrobbler.com/2.0/... ... Si vous accédez à un service d'écriture, vous devrez soumettre votre demande en tant que poste http demander."



0
votes

Et voici le code pour get album info de fatalg.fm même si l'erreur de retour:

la fonction: xxx

Utilisation: xxx


0 commentaires

1
votes

Je suis venu acort le même problème. Mon http_code est revenu 200 mais ma réponse était vide. Il pourrait y avoir beaucoup de raisons pour cela comme je l'ai expérimenté.

- Vos hédaers peuvent être incorrects p> xxx pré>

- Vous devrez peut-être envoyer des données en tant que champs de poste en culr et non attaché à l'URL comme URL? P1 = A1 & P2 = A2 EM> STRY> P>

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


0 commentaires