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

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

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

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

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

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

Спасибо

Пит


person Pete Williams    schedule 10.04.2010    source источник


Ответы (4)


Решением может быть разделение ваших манипуляций на два этапа:

  • Сначала получите строку XML, используя, например, curl
  • Затем поработайте над этой строкой с помощью DOMDocument.


Существует пример того, как вы можете использовать curl для < strong>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.

person Pascal MARTIN    schedule 11.04.2010

Я решил проблему, используя 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;
        }
    }
person birdy    schedule 22.12.2011

Вы всегда можете получить ответ с помощью какой-либо другой функции, например file_get_contents, а затем проанализировать XML с помощью DOMDocument::loadXML.

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

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

person Kemo    schedule 10.04.2010
comment
Это тоже была моя первая мысль, хотя, к сожалению, она дала тот же результат: Предупреждение: file_get_contents(someurl.com) [function.file-get-contents]: не удалось открыть поток: HTTP-запрос не выполнен! HTTP/1.0 400 Неверный запрос в userclass.php в строке 23 - person Pete Williams; 11.04.2010

Функция:

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));
}
person Fabiano Shark    schedule 05.05.2011