一個細細嘅 Laravel 服務就可以call exchangerate.dev、拒絕錯誤回應,仲可以將完整嘅匯率觀測快取 60 秒。密鑰放喺設定入面,同匯率一齊回傳 source、market_session 同 data_updated_at。
重點
用 Laravel HTTP 客戶端嘅 bearer 認證、逾時同
throw()。快取完整成功嘅回應 60 秒,穩穩陣陣咁留喺 Free 每分鐘 10 次請求嘅限制之內。
密鑰保存喺
config/services.php,透過 EXCHANGERATE_API_KEY 讀取,唔好寫入應用程式碼度。要精確計算金額就要用十進制程式庫。
整一個有快取嘅匯率服務
服務用基礎貨幣同排好序嘅代碼,整一個穩定嘅快取鍵。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_...讀取匯率同觀測欄位
call $service->latest("USD", ["EUR", "GBP"]),再讀 $result["rates"]["EUR"]。同時要保留 $result["source"]、$result["market_session"] 同 $result["data_updated_at"]。
唔好將錯誤快取成匯率
401 即係密鑰或者標頭錯誤,429 即係超出咗請求限制。畀個請求失敗啦,適時退避,舊觀測就淨係可以連同原本更新時間一齊保留。
- 整快取鍵之前,要先將貨幣代碼排好序。
- 設定有限嘅 HTTP 逾時。
- 讀取同快取 JSON 之前要call throw。
- 淨係四捨五入最終金額,唔好處理 API 匯率。
ER
exchangerate.dev
為用緊外匯數據嘅開發者而設嘅整合指南。
