无论响应类型如何,获取外部页面内容
我正在使用最近我注意到的代码在某些时候失败的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;
在重复的问题,指定我想包的处理,然后抛出一个专用异常时触发错误响应:
$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,用于测试目的。
此外,您可以包装不同但常见的返回类型。
如果你对这个例子的代码感兴趣,你可以在这里找到更多:https://gist.github.com/hakre/b654d1b7366273335dfd – hakre
这真是太棒了;我会深入研究它。但立即审查,我不明白这是如何解决simplexml_load_file不加载403错误响应的问题?你能指出这一点吗?或者你的意思是只处理一个异常,即使它没有得到回应? – RhoVisions
@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
你可以分享网址吗? –
http://api.eveonline.com/account/Characters.xml.aspx?userID=8166034&characterID=91242713&apiKey=B174C8B7B4364048B8A44B8C494904059D50B942BB4748FD907FF1DBF3F18282 – RhoVisions
您是否在询问如何获取最后一次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