خطاها و روش بازیابی
API علاوه بر status استاندارد HTTP، یک code داخلی و پیام قابلخواندن برمیگرداند. منطق برنامه را بر اساس HTTP status و code پیاده کنید، نه متن پیام.
ساختار پاسخ خطا
فیلد meta اختیاری است و در بعضی خطاها اطلاعات تکمیلی مانند موجودی فعلی، مبلغ لازم یا زمان retry را دارد.
{
"status": "error",
"code": 1004,
"message": "موجودی کیف پول کافی نیست",
"meta": {
"currentBalance": 120000,
"requiredAmount": 490000
}
}کدهای قابل مدیریت
| HTTP | code | معنی | اقدام پیشنهادی |
|---|---|---|---|
| 400 | 1004 | موجودی کیف پول کافی نیست | موجودی و مبلغ سفارش را بررسی کنید. |
| 400 | 1006 | محصول یا پراپرتی موجود نیست | کاتالوگ و وضعیت موجودی را دوباره بخوانید. |
| 400 | 1007 | شناسه یا پارامتر نامعتبر است | نوع داده و مقدار پارامتر را اصلاح کنید. |
| 400 | 1008 | دستهبندی نامعتبر است | شناسه را از endpoint دستهبندیها بگیرید. |
| 401 | 1001 | API Key ارسال نشده یا معتبر نیست | هدر X-API-KEY و فعال بودن کلید را بررسی کنید. |
| 403 | 1003 | IP درخواست مجاز نیست | IP خروجی سرور را به whitelist اضافه کنید. |
| 404 | 1005 / 404 | منبع مورد نظر پیدا نشد | شناسه و مالکیت منبع را بررسی کنید. |
| 405 | 405 | متد HTTP مجاز نیست | از متد ثبتشده در مرجع endpoint استفاده کنید. |
| 429 | 1002 | تعداد درخواست بیش از حد مجاز است | طبق Retry-After با تأخیر دوباره تلاش کنید. |
| 500 | 500 | خطای داخلی سرویس | با backoff تلاش کنید و در تکرار خطا گزارش دهید. |
موجودی و مبلغ سفارش را بررسی کنید.
کاتالوگ و وضعیت موجودی را دوباره بخوانید.
نوع داده و مقدار پارامتر را اصلاح کنید.
شناسه را از endpoint دستهبندیها بگیرید.
هدر X-API-KEY و فعال بودن کلید را بررسی کنید.
IP خروجی سرور را به whitelist اضافه کنید.
شناسه و مالکیت منبع را بررسی کنید.
از متد ثبتشده در مرجع endpoint استفاده کنید.
طبق Retry-After با تأخیر دوباره تلاش کنید.
با backoff تلاش کنید و در تکرار خطا گزارش دهید.
Retry و backoff
فقط خطاهای موقت مانند 429 و 5xx را دوباره امتحان کنید. خطاهای اعتبارسنجی و احراز هویت تا زمان اصلاح ورودی نباید retry شوند.
async function requestWithRetry(url, options, attempt = 0) {
const response = await fetch(url, options);
if (response.status === 429 && attempt < 3) {
const retryAfter = Number(response.headers.get("Retry-After") || 2);
await new Promise(resolve => setTimeout(resolve, retryAfter * 1000));
return requestWithRetry(url, options, attempt + 1);
}
if (response.status >= 500 && attempt < 3) {
await new Promise(resolve => setTimeout(resolve, 2 ** attempt * 1000));
return requestWithRetry(url, options, attempt + 1);
}
return response;
}