2013-11-01 110 views
0

我正在使用最近我注意到的代码在某些时候失败的API。我通过file_get_contents检索它,并且出现错误“无法打开流:HTTP请求失败!”无论响应类型如何,获取外部页面内容

我直接将URL插入到浏览器中,然后回复回复,所以我很困惑。我想要检查标题,并且我注意到它会出现403,我必须假设这就是它失败的原因?当它不是403时,它确实有效。只有当API身份验证失败时才会出现403,并且我有代码来检查返回的XML是否表示失败。

所以真的问题是,我该如何取回代码,无论它是否403。我将开始使用simplexml_load_file,因为无论如何我都将它加载到SimpleXML中,但是如果有另一种方法可以/应该使用,那么建议也会很棒。

编辑:我已经尝试了简单的卷曲请求,但除非我做错了,它也未能:

$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

您是否在询问如何获取最后一次file_get_contents操作的HTTP状态码?是的,'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 - 你将PHP的http wrapper上下文选项设置为*忽略错误*,这是重要的设置。另请参阅:[首先使用PHP Streams](http://hakre.wordpress.com/2011/09/17/head-first-with-php-streams/),其中该设置也会详细解释。如果您不想使用'file_get_contents'而只使用'simplexml_load_file',则需要更改默认的上下文。 – hakre