我有一个类函数来连接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
常见问题是URL中的空格 - 开头,中间或尾随.你检查出来了吗?
编辑 - 根据下面的评论,间距不是问题.
我运行你的代码并遇到了同样的问题 - 没有任何输出.我尝试了URL并通过GET请求,服务器与我交谈.我会做以下事情:
使用以下作为$ base_url:$ base_url =' http ://ws.audioscrobbler.com/2.0/?user=bachya&period=&api_key=xxx&method=user.getTopTracks ';
从您的请求中删除帖子字段.
编辑 我把你的代码移出课堂,因为我没有其余的并修改它.以下代码对我来说非常完美.如果这些更改不适合您,我建议您的错误功能不同.
'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(); ?>
服务器收到了您的请求,但发送了空响应.检查结果curl_getinfo($ch, CURLINFO_HTTP_CODE)
以确定服务器是否响应了HTTP错误代码.
更新:确定,以便服务器使用100 Continue
HTTP状态代码进行响应.在这种情况下,这应该可以解决您的问题:
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
我在这里找到了这个:PHP和cURL:禁用100-continue标头.希望它有效!