Загрузка DOMDocument на страницу, возвращающую статус 400 Bad Request
Я пытаюсь использовать Last.fm API для создаваемого приложения, но у меня возникли проблемы с проверкой.
Если запрос API выдает ошибку, он возвращает код и сообщение в XML-ответе следующим образом:
<lfm status="failed">
<error code="6">No user with that name</error>
</lfm>
Однако запрос также возвращает HTTP-статус 400 (или, в некоторых случаях, 403), который DOMDocument считает ошибкой, и затем отказывается анализировать XML.
Есть ли способ обойти это, чтобы я мог получить код ошибки и сообщение?
Спасибо
Пит
4 ответа
Решением может быть разделение ваших манипуляций на два шага:
- Во-первых, получите строку XML, используя, например, curl
- Затем поработайте над этой строкой
DOMDocument
,
Есть пример того, как вы можете использовать curl на curl_exec
страница справочника; добавив несколько полезных опций, вы могли бы использовать что-то вроде этого, я полагаю:
$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
И, для дополнительных опций (их много ^^), вы можете взглянуть на страницу руководства curl_setopt
,
Я решил проблему с помощью try & catch. Если это может помочь кому-то
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;
}
}
Вы всегда можете получить ответ с помощью другой функции, например file_get_contents
а затем проанализировать XML с DOMDocument::loadXML
Редактировать:
Функция:
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;
}
Использование:
// 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));
}