Я пытаюсь использовать API Last.fm для приложения, которое я создаю, но у меня есть некоторые проблемы с проверкой.
Если запрос API дает ошибку, он возвращает код и сообщение в XML-ответе следующим образом:
<lfm status="failed"> <error code="6">No user with that name</error> </lfm>
Тем не менее, запрос также возвращает HTTP-статус 400 (или, в некоторых случаях, 403), который DOMDocument считает ошибкой и поэтому отказывается разбирать XML.
Есть ли способ обойти это, чтобы я мог получить код ошибки и сообщение?
благодаря
Пит
Решение может заключаться в том, чтобы разделить ваши манипуляции в два этапа:
DOMDocument
. Пример использования curl на curl_exec
руководства 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)); }