0

私が最近気付いた API を使用していますが、コードで時々失敗することがあります。file_get_contents で取得すると、「ストリームを開くことができませんでした: HTTP 要求が失敗しました!」というエラーが表示されます。

URLをブラウザに直接差し込んだところ、レスポンスが返ってきたので戸惑いました。ヘッダーをチェックしようと思ったのですが、403 が表示されていることに気付きました。403 でない場合は機能します。403 は、API 認証が失敗した場合にのみ表示されます。返された XML が失敗を示しているかどうかを確認するコードがあります。

本当に問題は、コードが 403 であるかどうかに関係なく、どうすればコードを取り戻すことができるかということです。とにかくSimpleXMLにロードしているので、simplexml_load_fileの使用を開始するつもりでしたが、使用できる/使用すべき別の方法があれば、そのアドバイスも素晴らしいでしょう。

編集:単純な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;
4

1 に答える 1

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この出力が示すように、then に変換できます。

Exception: EveApiError; Code: 203; Message: Authentication failure.

Fatal error: Uncaught exception 'EveApiError' with message 
'Authentication failure.' in ...

これにより、エラー処理がラップされるだけでなく、テスト目的で独自の API を挿入できる API アクセスもラップされます。

さらに、異なるが一般的な戻り値の型をラップできます。

于 2013-11-02T13:09:24.433 に答える