PHP cURL错误:“从服务器清空回复”

时间:2010-06-10 20:46:50

标签: php curl last.fm

我有一个类函数来与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

5 个答案:

答案 0 :(得分:10)

常见问题是URL中的空格 - 开头,中间或尾随。你检查出来了吗?

修改 - 根据以下评论,间距不是问题。

我运行了你的代码并遇到了同样的问题 - 没有任何输出。我尝试了URL并通过GET请求,服务器与我交谈。我会做以下事情:

  1. 将以下内容用作$ base_url:$ base_url ='http://ws.audioscrobbler.com/2.0/?user=bachya&period=&api_key=xxx&method=user.getTopTracks';

  2. 从您的请求中删除帖子字段。

  3. 修改 我把你的代码移出课堂,因为我没有其余的并修改它。以下代码对我来说非常完美。如果这些更改不适合您,我建议您的错误功能不同。

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