PHP cURL error: “Empty reply from server”

后端 未结 5 1949
感情败类
感情败类 2020-12-29 14:50

I have a class function to interface with the RESTful API for Last.FM - its purpose is to grab the most recent tracks for my user. Here it is:

private stati         


        
相关标签:
5条回答
  • 2020-12-29 15:04

    And here's the code for get Album Info from Laft.FM even if return error:

    The Function:

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

    Usage:

    // 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));
    }
    
    0 讨论(0)
  • 2020-12-29 15:06

    According to Last.FM API documentation you should use GET method instead of POST to pass parameters. When I've changed POST to GET I've received the answer about incorrect key.

    0 讨论(0)
  • 2020-12-29 15:08

    I came acorss the same issue. My Http_code returned 200 but my response was empty. There could be many reasons for this as i experienced.

    --Your hedaers might be incorrect

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

    --You might need to send data as post fields in culr and not attached to the URl like url?p1=a1&p2=a2

    $data = array (p1=>a1, p2=>a2)
    CURLOPT_POSTFIELDS => $data
    

    So your options array would be similar to the below

    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,
    );
    
    0 讨论(0)
  • 2020-12-29 15:14

    The server received your request, but sent an empty response. Check the result of curl_getinfo($ch, CURLINFO_HTTP_CODE) to find out if the server responded with an HTTP error code.

    Update: Ok so the server responds with the 100 Continue HTTP status code. In that case, this should solve your problem:

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

    I found this here: PHP and cURL: Disabling 100-continue header. Hope it works!

    0 讨论(0)
  • 2020-12-29 15:16

    A common issue are spaces in the URL - beginning, in the middle, or trailing. Did you check that out?

    Edit - per comments below, spacing is not the issue.

    I ran your code and had the same problem - no output whatsoever. I tried the URL and with a GET request, the server talks to me. I would do the following:

    1. Use the following as $base_url: $base_url = 'http://ws.audioscrobbler.com/2.0/?user=bachya&period=&api_key=xxx&method=user.getTopTracks';

    2. Remove the post fields from your request.

    Edit I moved your code out of the class since I didn't have the rest and modified it. The following code runs perfect for me. If these changes don't work for you, I suggest that your error is in a different function.

    <?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();
    
    ?>
    
    0 讨论(0)
提交回复
热议问题