Получить внешний контент страницы независимо от типа ответа

Я работаю с API, который недавно заметил, что в коде иногда происходит сбой. Я получаю его с помощью file_get_contents и получаю сообщение об ошибке "Не удалось открыть поток: не удалось выполнить HTTP-запрос!"

Я подключил URL-адрес прямо в браузер и получил ответ, так что я был сбит с толку. Я подумал проверить заголовки и заметил, что он подходит к 403, и я должен предположить, что именно поэтому он не работает? Когда это не 403, это работает. 403 появляется только при сбое аутентификации API, и у меня есть код, чтобы проверить, говорит ли возвращаемый XML, что это сбой.

Так что на самом деле вопрос в том, как мне вернуть код, независимо от того, является ли он 403 или нет. Я собирался начать использовать simplexml_load_file, так как я все равно загружаю его в SimpleXML, но если есть и другой метод, который я могу / должен использовать, этот совет тоже был бы полезен.

РЕДАКТИРОВАТЬ: Я попытался простой запрос curl, но если я не сделал это неправильно, он также не удалось:

$curlObject = curl_init('https://api.eveonline.com/account/Characters.xml.aspx?userID=8166034&characterID=91242713&apiKey=B174C8B7B4364048B8A44B8C494904059D50B942BB4748FD907FF1DBF3F18282');
curl_setopt($curlObject, CURLOPT_RETURNTRANSFER, 1);
$fileContents = curl_exec($curlObject);
curl_close($curlObject);

echo $fileContents;

1 ответ

Я бы обернул обработку, как указано в дублирующем вопросе, а затем выдал бы выделенное исключение, когда вы запускаете этот ответ об ошибке:

$legacyKey = [
    'userID' => '8166034',
    'apiKey' => 'B174C8B7B4364048B8A44B8C494904059D50B942BB4748FD907FF1DBF3F18282',
];

$api = new EveApi($legacyKey);
$api->define('getAccountCharacters', 'account/Characters.xml.aspx', ['characterID']);

try {
    $characters = $api->getAccountCharacters($characterID = '91242713');
} catch(Exception $exception) {
    printf("Exception: %s; Code: %s; Message: %s\n", get_class($exception), $exception->getCode(), $exception->getMessage());
    throw $exception;
}

В этом примере обработка по умолчанию из EveApi было бы бросить исключения на такие ошибки:

<?xml version="1.0" encoding="UTF-8"?>
<eveapi version="2">
  <currentTime>2013-11-02 13:06:53</currentTime>
  <error code="203">Authentication failure.</error>
  <cachedUntil>2013-11-03 13:06:53</cachedUntil>
</eveapi>

Может быть превращен в EveApiError тогда как этот вывод показывает:

Exception: EveApiError; Code: 203; Message: Authentication failure.

Fatal error: Uncaught exception 'EveApiError' with message 
'Authentication failure.' in ...

Это позволит не только обработать ошибки, но и получить доступ к API, что позволит вам внедрить свой собственный API для целей тестирования.

Кроме того, вы можете обернуть различные, но распространенные типы возврата.

Другие вопросы по тегам