我有一个类函数来与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
答案 0 :(得分:10)
常见问题是URL中的空格 - 开头,中间或尾随。你检查出来了吗?
修改 - 根据以下评论,间距不是问题。
我运行了你的代码并遇到了同样的问题 - 没有任何输出。我尝试了URL并通过GET请求,服务器与我交谈。我会做以下事情:
将以下内容用作$ base_url:$ base_url ='http://ws.audioscrobbler.com/2.0/?user=bachya&period=&api_key=xxx&method=user.getTopTracks';
从您的请求中删除帖子字段。
修改强> 我把你的代码移出课堂,因为我没有其余的并修改它。以下代码对我来说非常完美。如果这些更改不适合您,我建议您的错误功能不同。
<?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();
?>
答案 1 :(得分:7)
服务器收到了您的请求,但发送了空响应。检查curl_getinfo($ch, CURLINFO_HTTP_CODE)
的结果,以确定服务器是否响应了HTTP错误代码。
更新:确定,以便服务器以100 Continue
HTTP状态代码进行响应。在这种情况下,这应该可以解决您的问题:
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
我在这里找到了这个:PHP and cURL: Disabling 100-continue header。希望它有效!
答案 2 :(得分:1)
我出现了同样的问题。我的Http_code返回200,但我的回复是空的。我经历过这可能有很多原因。
- 你的hedaers可能不正确
CURLOPT_HTTPHEADER => array('Content-Type:application/json', 'Expect:')
- 您可能需要在culr中将数据作为帖子字段发送,而不是像 url那样附加到URl?p1 = a1&amp; p2 = a2
$data = array (p1=>a1, p2=>a2)
CURLOPT_POSTFIELDS => $data
所以你的选项数组将类似于下面的
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,
);
答案 3 :(得分:0)
根据Last.FM API documentation,您应该使用GET方法而不是POST来传递参数。当我将POST更改为GET时,我收到了关于错误密钥的答案。
答案 4 :(得分:0)
即使返回错误,这里也是来自Laft.FM的 获取相册信息 的代码:
功能:
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;
}
<强>用法:强>
// 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));
}