الرموز
| الرمز | متى | ما تفعله |
|---|---|---|
| 200 | نجح الطلب | اقرأ JSON |
| 302 | /dl يحوّل إلى الملف | يتبعه المتصفح |
| 307 | الصورة المصغرة تحوّل إلى ملفها | يتبعه المتصفح |
| 308 | الجهة غيّرت slug | اتبع Location، وحدّث ما حفظته |
| 404 | لا جهة منشورة بهذا المعرّف، أو لا ملف | اعرض «غير موجود» |
| 429 | تجاوزت الحد | انتظر Retry-After ثانية، ثم أعد مرة |
أجسام الأخطاء
GET /api/v1/brands/{slug} حين لا توجد الجهة، بـ 404:
{ "error": "not_found" }GET /api/v1/search/suggest بعد تجاوز الحد، بـ 429:
{ "items": [], "error": "rate_limited" }/dl و/thumb تعيدان نصًا قصيرًا لا JSON.
إعادة المحاولة بعد 429
get-json.js
/** GET with one wait-and-retry on 429, as the server asks. */export async function getJson(url) { for (let attempt = 0; attempt < 2; attempt++) { const res = await fetch(url); if (res.status === 429 && attempt === 0) { const seconds = Number(res.headers.get('Retry-After') ?? 60); await new Promise((r) => setTimeout(r, seconds * 1000)); continue; } if (res.status === 404) return null; if (!res.ok) throw new Error(`HTTP ${res.status}`); return res.json(); }}