使用LastFM API和simplexml_load_file进行错误处理

时间:2012-10-21 00:24:40

标签: php xml last.fm

我正在使用simplexml_load_file从LastFM API中提取相册信息,并且在请求的相册匹配时没有问题。

但是,当找不到相册时,LastFM会返回error,这会导致下面的代码输出“无法打开的流”错误。

我可以看到LastFM正在给我我需要的东西,但我不确定如何继续。更新代码的正确方法是什么,以便正确处理此错误/错误代码?

代码:     

$feed = simplexml_load_file("http://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=".$apikey."&artist=".$artist."&album=".$album."&autocorrect=".$autocorrect);

$albums = $feed->album;
foreach($albums as $album) {

    $name = $album->name;
    $img = $album->children();
    $img_big = $img->image[4];
    $img_small = $img->image[2];
    $releasedate = $album->releasedate;
    $newdate = date("F j, Y", strtotime($releasedate));

    if ($img == "") {
            $img = $emptyart; }
}
?>

3 个答案:

答案 0 :(得分:1)

   if ($headers[0] == 'HTTP/1.0 400 Bad Request') {
      $img_big = $emptyart;
      $img_small = $emptyart;
   }

这将破坏403错误......

方法1(不实用): 基本上你可以用@来静音错误并检查你的$ feed是否为空。在这种情况下,发生了“一些错误”,无论是您的网址错误还是状态都来自last.fm失败。

    $feed = @simplexml_load_file("http://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=".$apikey."&artist=".$artist."&album=".$album."&autocorrect=".$autocorrect);
    if ($feed)
    {
        // fetch the album info
    }
    else
    {
        echo "No results found.";
    }

在这两种方式中,您都没有得到任何结果,因此您可以满足您的需求并显示“未找到结果”,而不是向他显示“Last.fm错误状态代码等”。

方法2(推荐) - 使用curl:

    function load_file_from_url($url) {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_REFERER, 'http://www.test.com/');
        $str = curl_exec($curl);

        if(str === false)
        {
            echo 'Error loading feed, please try again later.';
        }

        curl_close($curl);
        return $str;
    }

    function load_xml_from_url($url) {
        return @simplexml_load_string(load_file_from_url($url));
    }

    function getFeed($feedURL)
    {
        $feed = load_xml_from_url($feedURL);
        if ($feed)
        {
                if ($feed['status'] == "failed")
            {
                echo "FAIL";
            }
            else
            {
                echo "WIN";
            }
        }
        else {echo "Last.fm error";}
    }

    /* Example:
       Album: Heritage
       Artist: Opeth
    */

    $url = "http://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=273f3dc84c2d55501f3dc25a3d61eb39&artist=opeth&album=hwwXCvuiweitage&autocorrect=0";
    $feed = getFeed ($url);
    // will echo FAIL

    $url2 = "http://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=273f3dc84c2d55501f3dc25a3d61eb39&artist=opeth&album=heritage&autocorrect=0";
    $feed2 = getFeed ($url2);
    // will echo WIN

答案 1 :(得分:0)

首先获取url是否更好,检查它是否包含错误,然后使用simplexml_load_string?

答案 2 :(得分:0)

在将URL传递给simplexml_load_file之前评估URL的状态时,我尝试了get_headers,并且加上if / else语句,似乎已经让事情发生了变化

$url = "http://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=".$apikey."&artist=".$artist."&album=".$album."&autocorrect=".$autocorrect;

$headers = get_headers($url, 1);

if ($headers[0] == 'HTTP/1.0 400 Bad Request') {
    $img_big = $emptyart;
    $img_small = $emptyart;
    }

else {
    $feed = simplexml_load_file($url);

    $albums = $feed->album;
    foreach($albums as $album) {

        $name = $album->name;
        $img = $album->children();
        $img_big = $img->image[4];
        $img_small = $img->image[2];
        $releasedate = $album->releasedate;
        $newdate = date("F j, Y", strtotime($releasedate));

        if ($img == "") {
            $img_big = $emptyart;
            $img_small = $emptyart;
            }
    }
}