Загрузка DOMDocument на странице, возвращающей 400 Bad Request status

Я пытаюсь использовать API Last.fm для приложения, которое я создаю, но у меня есть некоторые проблемы с проверкой.

Если запрос API дает ошибку, он возвращает код и сообщение в XML-ответе следующим образом:

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

Тем не менее, запрос также возвращает HTTP-статус 400 (или, в некоторых случаях, 403), который DOMDocument считает ошибкой и поэтому отказывается разбирать XML.

Есть ли способ обойти это, чтобы я мог получить код ошибки и сообщение?

благодаря

Пит

Solutions Collecting From Web of "Загрузка DOMDocument на странице, возвращающей 400 Bad Request status"

Решение может заключаться в том, чтобы разделить ваши манипуляции в два этапа:

  • Во-первых, получить XML-строку, используя curl , например
  • Затем работайте над этой строкой с помощью 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

Редактировать:

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

Функция:

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