سجّل HttpClient منضبط الأنواع، واحقن المفتاح من الإعدادات، واقرأ الأسعار كـdecimal مع تمرير الإلغاء.
نقاط أساسية
استخدم
IHttpClientFactory.اقرأ الأسعار كـ
decimal.مرر
CancellationToken وضع مهلة.نفذ
EnsureSuccessStatusCode() قبل فك JSON.سجّل HttpClient منضبط الأنواع
يضبط التسجيل العنوان وbearer token والمهلة، ويحافظ العميل على عقد الاستجابة والإلغاء.
// Program.cs
using System.Net.Http.Headers;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpClient<FxClient>(client =>
{
var key = builder.Configuration["EXCHANGERATE_API_KEY"]
?? throw new InvalidOperationException("EXCHANGERATE_API_KEY is missing");
client.BaseAddress = new Uri("https://api.exchangerate.dev/v1/");
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", key);
client.Timeout = TimeSpan.FromSeconds(5);
});
// FxClient.cs
using System.Net.Http.Json;
using System.Text.Json.Serialization;
public sealed record LatestRates(
string Base,
string Source,
[property: JsonPropertyName("market_session")] string MarketSession,
[property: JsonPropertyName("data_updated_at")] DateTimeOffset DataUpdatedAt,
Dictionary<string, decimal> Rates
);
public sealed class FxClient(HttpClient http)
{
public async Task<LatestRates> GetLatestAsync(
string baseCurrency,
CancellationToken cancellationToken)
{
using var response = await http.GetAsync(
$"latest/{baseCurrency}?symbols=EUR,GBP",
cancellationToken);
response.EnsureSuccessStatusCode();
return await response.Content.ReadFromJsonAsync<LatestRates>(
cancellationToken: cancellationToken)
?? throw new InvalidOperationException("Empty FX response");
}
}مرر الإلغاء من الطلب
var app = builder.Build();
app.MapGet("/fx", async (
FxClient fx,
CancellationToken cancellationToken) =>
{
var rates = await fx.GetLatestAsync("USD", cancellationToken);
return Results.Ok(new {
eur = rates.Rates["EUR"],
rates.Source,
rates.MarketSession,
rates.DataUpdatedAt,
});
});
app.Run();خزّن الرصد الناجح فقط
خزّن الرصد الكامل مع Source وMarketSession وDataUpdatedAt، لا Rates["EUR"] وحده.
ضيّق سياسة الإعادة
أعد أخطاء الشبكة القصيرة وبعض 5xx فقط. لا تعامل 401 كمؤقت ولا تنشئ موجة بعد 429.
- استخدم تسجيلا واحدا.
- استخدم decimal.
- مرر الإلغاء.
- ارفض الأخطاء قبل فك البيانات.
ER
exchangerate.dev
أدلة تكامل للمطورين العاملين مع بيانات العملات.
