我正在使用我最近注意到的API在某些时候在代码中失败了。我通过file_get_contents检索它,我收到错误“无法打开流:HTTP请求失败!”
我直接将URL插入浏览器并收到回复,所以我很困惑。我想检查标题,我注意到它会出现403,我不得不假设它失败的原因是什么?当它不是403时,它确实有效。 403只在API身份验证失败时出现,我有代码检查返回的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)
我会按重复问题中的指定包装处理,然后在触发错误响应时抛出一个专用异常:
$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用于测试目的。
此外,您可以包装不同但常见的返回类型。