我有一个类函数来与Last.FM的 RESTful API 交互——它的目的是为我的用户获取最新的曲目。这里是:
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;
}
这返回"Empty reply from server"
。我知道有些人认为这个错误来自网络基础设施的一些故障;在我的情况下,我不相信这是真的。如果我通过命令行运行 cURL 请求,我会得到我的数据;Last.FM 服务已启动并可访问。
在我去找那些人看看是否有任何变化之前,我想和你们好好谈谈,看看我的代码中是否存在导致这种情况的问题。
谢谢!
答案: @Jan Kuboschek 帮助我偶然发现了这里(可能)发生的事情。通过提供CURLOPT_POSTFIELDS
关联数组,指定了可能不适用于某些 RESTful 服务的特定内容类型。更聪明的解决方案是手动创建该数据的 URL 编码版本并将其作为CURLOPT_POSTFIELDS
.
有关更多信息,请查看:http ://www.brandonchecketts.com/archives/array-versus-string-in-curlopt_postfields