【问题标题】:Get external page content regardless of response type [duplicate]无论响应类型如何,都获取外部页面内容[重复]
【发布时间】:2013-11-12 19:11:11
【问题描述】:

我正在使用我最近注意到的 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;

【问题讨论】:

标签: php xml curl simplexml api-eveonline


【解决方案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 以进行测试。

此外,您可以包装不同但常见的返回类型。

【讨论】:

  • 如果您对示例代码感兴趣,可以在这里找到更多信息:gist.github.com/hakre/b654d1b7366273335dfd
  • 太棒了;我会深入研究一下。但是在立即审查时,我看不出这如何解决 simplexml_load_file 未加载 403 错误响应的问题?你能给我指出来吗?还是您的意思是只处理异常,即使它没有得到响应?
  • @RhoVisions:对不起,我认为这与重复问题中所做的完全一样:stackoverflow.com/questions/6040978/… - 你需要将 PHP 的 http 包装器上下文选项设置为 忽略错误 i>,这是重要的设置。另请参阅:HEAD first with PHP Streams,其中也更详细地解释了该设置。而如果你不想使用file_get_contents 而使用simplexml_load_file,则需要更改默认上下文。
  • 与此行比较 ff.: gist.github.com/hakre/…
  • 啊,这就是问题所在。我误读了你的代码。我看到了 simplexml_load_file 并错过了 file_get_contents。谢谢!
猜你喜欢
  • 2014-01-11
  • 2011-02-11
  • 2016-03-20
  • 2011-05-02
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多