DOMDocument load on a page returning 400 Bad Reque

2019-06-09 02:25发布

I'm trying to use the Last.fm API for an application I'm creating, but am having some problems with validation.

If an API request gives an error it returns a code and message in the response XML like this:

<lfm status="failed">
<error code="6">No user with that name</error>
</lfm>

However, the request also returns an HTTP status of 400 (or in some cases 403) which DOMDocument considers an error and so then refuses to parse the XML.

Is there any way round this, so that I can retrieve the error code and message?

Thanks

Pete

4条回答
贼婆χ
2楼-- · 2019-06-09 02:59

I resolved the issue by using try & catch. If it can help someone

    function getXML($xml) {
            $dom = new DomDocument();
        try {
            @$dom->load($xml); // The '@' is necessary to hide error if it's a error 400 - Bad Request
            $root = $dom->documentElement;
            return $root;
        }
        catch(Exception $e)
        {
            return false;
        }
    }
查看更多
虎瘦雄心在
3楼-- · 2019-06-09 03:10

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));
}
查看更多
淡お忘
4楼-- · 2019-06-09 03:11

You can always get the response with some other function like file_get_contents and then parse the XML with DOMDocument::loadXML

Edit:

http://www.php.net/manual/en/domdocument.load.php#91384

查看更多
看我几分像从前
5楼-- · 2019-06-09 03:12

A solution could be to separate your manipulations in two steps :

  • First, get the XML string, using curl, for example
  • Then, work on that string with DOMDocument.


There is an example of how you can use curl on the curl_exec manual page ; adding a few useful options, you could use something like this, I suppose :

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "YUR_URL_HERE");
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$xml_string = curl_exec($ch);
curl_close($ch);

// You can now work with $xml_string

And, for more options (there are a lot of them ^^ ), you can take a look to the manual page of curl_setopt.

查看更多
登录 后发表回答