معالجة الأخطاء
رموز أخطاء MetalAPI ورموز حالة HTTP المقابلة لها، وكيفية معالجة الطلبات الفاشلة وإعادة محاولتها بأمان، مع أمثلة شيفرة جاهزة بلغة JavaScript.
صيغة استجابة الخطأ
عند فشل الطلب، تستجيب الواجهة بحالة خطأ HTTP وجسم JSON يحتوي على success: false. ويتضمن الكائن error رمزًا رقميًا في code، ونوعًا قابلًا للقراءة آليًا في type، ورسالة مفهومة للبشر في info:
{
"success": false,
"error": {
"code": 101,
"type": "no_api_key",
"info": "User did not supply an API Key"
}
}اعتمد في منطق شيفرتك على code أو type، لا على نص info الذي قد يتغير. الرموز هي نفسها كما في الإصدارات السابقة من MetalAPI، لذا تستمر التكاملات الحالية في العمل.
أخطاء المصادقة والحساب
101no_api_key(401): لا يحتوي الطلب على مفتاح API.102invalid_api_key(401): المفتاح غير معروف أو تم إلغاؤه.103account_inactive(403): الحساب غير نشط. تواصل مع الدعم.107origin_not_allowed(403): استُخدم مفتاح مقيّد بالنطاق من موقع ليس ضمن قائمة النطاقات المسموح بها.
أخطاء الحدود والخطط
104too_many_requests(429): تم بلوغ حد الطلبات في الدقيقة. انتظر عدد الثواني المذكور في ترويسةRetry-After.105quota_exceeded(429): استُنفدت الحصة الشهرية حتى اليوم الأول من الشهر التالي (UTC).106plan_restriction(403): نقطة النهاية أو المعامل غير مشمول في خطتك، مثل/caratفي خطة Free أوXAU-BIDفي الخطط الأدنى من Standard.
أخطاء التحقق
تُرجع هذه الأخطاء حالة HTTP 400، وتعني أن الطلب نفسه يحتاج إلى تصحيح:
201invalid_base: رمزbaseغير معروف.202invalid_fromو203invalid_to: رمزfromأوtoغير معروف في/convert.204invalid_amount: المعاملamountمفقود أو ليس رقمًا.205invalid_date: تاريخ بصيغة غير صحيحة، أو تاريخ في المستقبل.206invalid_timeframe: المعاملstart_dateأوend_dateمفقود، أو تاريخ البداية بعد تاريخ النهاية.207timeframe_too_long: النطاق أطول مما تسمح به خطتك (30 يومًا في Free، و365 يومًا في الخطط المدفوعة).208invalid_symbols: لا يوجد أي من الرموز المطلوبة.209invalid_unit: قيمةunitغير مدعومة.210invalid_carat: عيار غير مدعوم.
في currencies، تُتجاهل الرموز غير المعروفة ما دام رمز واحد على الأقل صالحًا.
أخطاء أخرى
300no_results(404): الاستعلام صالح لكن لا توجد بيانات، كتاريخ يسبق بداية سجل الرمز.404invalid_function(404): نقطة نهاية غير معروفة. تحقّق من عنوان URL.500server_error(500): خطأ غير متوقع من جهتنا.503service_unavailable(503): بيانات الأسعار غير متاحة مؤقتًا.
معالجة الأخطاء في الشيفرة
تحقّق من success في كل استجابة وحوّل حالات الفشل إلى أخطاء يمكن لشيفرتك فحصها. تتعامل هذه الدالة المساعدة أيضًا مع الاستجابات غير المكتوبة بصيغة JSON القادمة من الخوادم الوكيلة:
async function metalapi(path, params = {}) {
const url = new URL(`https://metalapi.com/api/v1/${path}`);
for (const [key, value] of Object.entries(params)) url.searchParams.set(key, value);
const res = await fetch(url, { headers: { "X-API-Key": process.env.METALAPI_KEY } });
const data = await res.json().catch(() => ({
success: false,
error: { code: res.status, type: "http_error", info: res.statusText },
}));
if (!data.success) {
const err = new Error(`MetalAPI ${data.error.code} (${data.error.type}): ${data.error.info}`);
err.code = data.error.code;
err.retryAfter = Number(res.headers.get("Retry-After")) || undefined;
throw err;
}
return data;
}استراتيجية إعادة المحاولة
لا تُعِد المحاولة إلا في الأخطاء التي قد تنجح في محاولة ثانية:
104: انتظر عدد الثواني المحدد فيRetry-After، ثم أعد المحاولة.500و503وأخطاء الشبكة: أعد المحاولة مع تراجع أسي (ثانية، ثم ثانيتان، ثم 4 ثوانٍ)، وتوقف بعد ثلاث محاولات إعادة.- كل ما عدا ذلك (من
101إلى103، ومن105إلى107، ورموز التحقق2xx، و300، و404): لا تُعِد المحاولة، بل أصلح الطلب أو المفتاح أو الخطة.
إعادة محاولة الأخطاء 104 و5xx لا تكلّفك شيئًا، لأن هذه الطلبات الفاشلة لا تُحتسب.
async function withRetry(fn, retries = 3) {
for (let attempt = 0; ; attempt++) {
try {
return await fn();
} catch (err) {
const retryable = err.code === undefined || err.code === 104 || err.code >= 500;
if (!retryable || attempt >= retries) throw err;
const delay = err.retryAfter ? err.retryAfter * 1000 : 1000 * 2 ** attempt;
await new Promise((resolve) => setTimeout(resolve, delay));
}
}
}
const data = await withRetry(() => metalapi("latest", { currencies: "XAU,XAG" }));أدلة ذات صلة
هل أنت مستعد لبدء التطوير؟
أنشئ حسابًا مجانيًا للحصول على مفتاح API، أو استكشف جميع نقاط النهاية في مرجع API.