代码之家  ›  专栏  ›  技术社区  ›  ABach

php curl错误:“来自服务器的空回复”

  •  6
  • ABach  · 技术社区  · 15 年前

    Last.FM

    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服务已启动并可访问。

    在我去那些人那里看看是否有什么变化之前,我想和你的好朋友们核实一下,看看我的代码中是否有导致这种变化的问题。

    谢谢!

    答: @简·库博舍克帮助我偶然发现了这里发生的事情。通过给予 CURLOPT_POSTFIELDS 关联数组,指定的特定内容类型可能不适用于某些RESTful服务。一个更智能的解决方案是手动创建该数据的URL编码版本,并将其作为 curlopt_邮箱 .

    有关详细信息,请查看: http://www.brandonchecketts.com/archives/array-versus-string-in-curlopt_postfields

    5 回复  |  直到 9 年前
        1
  •  10
  •   Jan K.    15 年前

    常见的问题是URL中的空格-开头、中间或结尾。你查过了吗?

    编辑 -根据下面的注释,间距不是问题。

    我运行了你的代码,也遇到了同样的问题——没有任何输出。我尝试了该URL,并通过一个GET请求,服务器与我进行了交谈。我将执行以下操作:

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

    2. 从请求中删除“投递”字段。

    编辑 我把你的代码移出了课堂,因为我没有剩下的代码,我修改了它。下面的代码非常适合我。如果这些更改对您不起作用,我建议您的错误在另一个函数中。

    <?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();
    
    ?>
    
        2
  •  7
  •   cygri    15 年前

    服务器收到了您的请求,但发送了一个空响应。检查的结果 curl_getinfo($ch, CURLINFO_HTTP_CODE) 以查明服务器是否响应了HTTP错误代码。

    更新: 好的,所以服务器用 100 Continue HTTP状态代码。在这种情况下,这将解决您的问题:

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

    我在这里找到这个: PHP and cURL: Disabling 100-continue header . 希望它能起作用!

        3
  •  0
  •   Michał Pipa    15 年前

    根据last.fm API documentation 您应该使用get方法而不是post来传递参数。当我把帖子改了之后,我收到了关于钥匙不正确的答案。

        4
  •  0
  •   Fabiano Shark    14 年前

    这是密码 获取专辑信息 来自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));
    }
    
        5
  •  0
  •   nmeegama    11 年前

    我也遇到了同样的问题。我的http_代码返回200,但我的响应为空。正如我所经历的,这可能有很多原因。

    --你的快乐可能不正确

    CURLOPT_HTTPHEADER => array('Content-Type:application/json', 'Expect:')
    

    --您可能需要在culr中以post字段的形式发送数据,而不是像这样附加到URL

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