DOMDocument load on a page returning 400 Bad Request status

十年热恋 提交于 2019-12-08 14:09:21

问题


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


回答1:


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.




回答2:


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:


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




回答4:


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


来源:https://stackoverflow.com/questions/2615346/domdocument-load-on-a-page-returning-400-bad-request-status

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!