1

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

但是,当找不到专辑时,LastFM 会返回错误,这会导致下面的代码输出“打开流失败”错误。

我可以看到 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; }
}
?>
4

3 回答 3

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

这将因 403 错误而中断...

方法1(不实用):基本上你可以用@静音错误并检查你的$feed是否为空。在这种情况下,发生了“一些错误”,要么是您的 url 错误,要么是 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
于 2012-11-08T15:28:48.590 回答
0

先获取url,检查是否不包含错误,然后改用simplexml_load_string不是更好吗?

于 2012-10-21T00:33:15.010 回答
0

在将 URL 传递给之前,按照评估 URL 状态的方式工作simplexml_load_file,我尝试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;
            }
    }
}
于 2012-10-22T00:40:58.990 回答