2013-11-01 2 views
0

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

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

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

EDIT: я попытался простой завиток запрос, но если я не сделал это неправильно, его также не удалось:

$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; 
+0

Можете ли вы поделиться ссылкой? –

+0

http://api.eveonline.com/account/Characters.xml.aspx?userID=8166034&characterID=91242713&apiKey=B174C8B7B4364048B8A44B8C494904059D50B942BB4748FD907FF1DBF3F18282 – RhoVisions

+0

Вы спрашиваете, как получить код статуса HTTP последней операции file_get_contents? Да, «FALSE» означает сбой, точный код состояния является частью ['$ http_response_headers' (специальная зарезервированная переменная)] (http://php.net/reserved.variables.httpresponseheader), см. [Здесь для примера, как проанализировать его и получить код состояния] (http://stackoverflow.com/a/7566440/367456) (через: http://stackoverflow.com/q/9724924/367456). – hakre

ответ

0

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

$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 для целей тестирования.

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

+0

Если вас интересует код примера, вы можете найти его здесь: https://gist.github.com/hakre/b654d1b7366273335dfd – hakre

+0

Это довольно удивительно; Я посмотрю на это подробно. Но при немедленном просмотре, я не вижу, как это затрагивает проблему simplexml_load_file, не загружая ошибку с ошибкой 403? Не могли бы вы указать на это? Или вы хотите просто справиться с этим с исключением, даже если он не получит ответ? – RhoVisions

+0

@RhoVisions: Извините, я понял, что это точно так же, как в дублированном вопросе: http://stackoverflow.com/questions/6040978/need-response-body-of-http-500-with-file- get-contents-php - вам нужно установить параметр контекста http-оболочки PHP, чтобы * игнорировать ошибки *, то есть важный параметр. См. Также: [HEAD сначала с потоками PHP] (http://hakre.wordpress.com/2011/09/17/head-first-with-php-streams/), где эта настройка объясняется более подробно. И если вы не хотите использовать 'file_get_contents', но' simplexml_load_file', вам нужно изменить контекст по умолчанию. – hakre

Смежные вопросы