小さなLaravelサービスでexchangerate.devを呼び出し、HTTPエラーを拒否し、完全なFX観測を60秒キャッシュできる。キーは設定に置き、レートとともにsource、market_session、data_updated_atを返す。
要点
Laravel HTTPクライアントでbearer認証、タイムアウト、
throw()を使う。成功した完全な応答を60秒キャッシュする。
キーは
config/services.phpでEXCHANGERATE_API_KEYを通じて保持し、アプリケーションコードには置かない。正確な金額計算には10進数ライブラリを使う。
キャッシュ付きFXサービスを作る
このサービスはベースとソート済みシンボルから安定したキャッシュキーを作る。throw()がLaravelのキャッシュ書き込み前に実行されるため、失敗応答はレートとして保存されない。
<?php
namespace App\Services;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Http;
final class ExchangeRateService
{
public function latest(string $base, array $symbols): array
{
sort($symbols);
$symbolList = implode(',', $symbols);
$cacheKey = "fx:latest:{$base}:{$symbolList}";
return Cache::remember($cacheKey, now()->addSeconds(60), function () use (
$base,
$symbolList,
): array {
return Http::acceptJson()
->withToken(config('services.exchangerate.key'))
->timeout(5)
->get(
"https://api.exchangerate.dev/v1/latest/{$base}",
['symbols' => $symbolList],
)
->throw()
->json();
});
}
}キーをソース管理外に設定する
// config/services.php
'exchangerate' => [
'key' => env('EXCHANGERATE_API_KEY'),
],
// .env (never commit the real value)
EXCHANGERATE_API_KEY=exr_live_...レートと観測フィールドを読む
$service->latest("USD", ["EUR", "GBP"])を呼び、$result["rates"]["EUR"]を読む。$result["source"]、$result["market_session"]、$result["data_updated_at"]も保持する。
エラーをレートとしてキャッシュしない
401はキーまたはヘッダーの誤り、429は要求上限超過を示す。失敗させ、必要に応じてバックオフし、以前の成功観測を残す場合は元の更新時刻も残す。
- キャッシュキー作成前にシンボルをソートする。
- 有限のHTTPタイムアウトを設定する。
- JSONを読む前にthrowを呼ぶ。
- APIレートではなく最終金額を丸める。
ER
exchangerate.dev
FXデータを扱う開発者向けの統合ガイド。
