Linework Developers
AR
احصل على الوصول

المفاهيم

الأخطاء

تستخدم الأخطاء رموز حالة HTTP القياسية ولها دائمًا بنية JSON نفسها.

تنسيق الخطأ#

{
  "error": {
    "code": "INSUFFICIENT_SCOPE",
    "message": "This API key does not have the scope posts:write"
  }
}
  • code ثابت: استخدمه في شيفرتك.
  • message موجّه للبشر وقد يتغيّر.
  • تضيف بعض الأخطاء حقولًا إضافية بجانب code وmessage (مثلًا الحقل غير الصالح في خطأ التحقق).

رموز الأخطاء#

الحالةالرمزالمعنى · ما يجب فعله
400VALIDATION_ERRORمعامل أو حقل في جسم الطلب مفقود أو غير صالح. صحّح الطلب، ولا تُعِد المحاولة كما هو.
400INVALID_JSONجسم الطلب ليس JSON صالحًا. أرسل Content-Type: application/json وجسمًا صالحًا.
401INVALID_API_KEYمفتاح مفقود أو مشوّه أو ملغى. تحقق من الترويسة Authorization.
403INSUFFICIENT_SCOPEلا يملك المفتاح نطاق الصلاحية الذي تحتاجه نقطة النهاية هذه. أنشئ مفتاحًا بـنطاقات الصلاحية الصحيحة.
403DEVELOPER_ACCESS_REVOKEDتم تعليق وصول المطوّرين لهذا الحساب أو إلغاؤه. تواصل مع developers@linework.app.
403PROFILE_INCOMPLETEأضف صورة ملف شخصي وصورة غلاف إلى الحساب قبل استخدام نقاط نهاية الكتابة.
403CHAT_NOT_ALLOWEDقاعدة مكافحة الرسائل المزعجة لا تسمح بهذه الرسالة: لم يراسلك الشخص ولا يتابعك.
403CHAT_BLOCKEDأحدكما حظر الآخر. لا تُعِد المحاولة.
403STORE_BLOCKEDهذا المتجر حظرك.
403USER_UNAVAILABLEالمستخدم غير متاح (محظور، أو خاص، أو معلّق).
403FORBIDDENالإجراء غير مسموح به لهذا الحساب (مثلًا تعديل منشور شخص آخر).
404NOT_FOUNDالمورد غير موجود أو لا يمكنك رؤيته.
409CONFLICTيتعارض الطلب مع الحالة الحالية (مثلًا شحن طلب مرتين).
413PAYLOAD_TOO_LARGEجسم الطلب أو الملف المرفوع كبير جدًا. راجع حدود الوسائط في النشر مع الوسائط.
429RATE_LIMITEDطلبات كثيرة جدًا، أو تم استنفاد حصة يومية. انتظر مدة Retry-After. راجع حدود المعدّل.
500INTERNAL_ERRORحدث خطأ ما من جهتنا. أعد المحاولة لاحقًا مع التراجع التدريجي (backoff).

قد تُضاف رموز جديدة مع الوقت: تعامل مع أي رمز غير معروف بالمعنى العام لحالة HTTP الخاصة به.

إعادة المحاولة أم لا؟#

الحالةإعادة المحاولة؟
400, 401, 403, 404, 409, 413لا. صحّح الطلب أو المفتاح أو الحساب أولًا.
429نعم، بعد مدة Retry-After.
500, 502, 503, 504نعم، مع التراجع الأُسّي (exponential backoff). بالنسبة لعمليات الكتابة غير المتساوية القوة (non-idempotent) (مثلًا POST /posts)، تحقق أولًا من أن الإجراء لم يحدث بالفعل.

مثال على معالج الأخطاء#

const res = await fetch(url, options);
if (!res.ok) {
  const { error } = await res.json().catch(() => ({ error: { code: "UNKNOWN" } }));
  switch (error.code) {
    case "RATE_LIMITED": /* wait Retry-After, then retry */ break;
    case "INVALID_API_KEY":
    case "DEVELOPER_ACCESS_REVOKED": /* stop the bot and alert someone */ break;
    case "CHAT_NOT_ALLOWED": /* skip this user */ break;
    default: throw new Error(`${res.status} ${error.code}: ${error.message}`);
  }
}
r = s.post(url, json=body, timeout=30)  # s = requests.Session() with the Authorization header
if not r.ok:
    err = r.json().get("error", {})
    code = err.get("code")
    if code == "RATE_LIMITED":
        ...  # wait Retry-After, then retry
    elif code in ("INVALID_API_KEY", "DEVELOPER_ACCESS_REVOKED"):
        ...  # stop the bot and alert someone
    elif code == "CHAT_NOT_ALLOWED":
        ...  # skip this user
    else:
        raise RuntimeError(f"{r.status_code} {code}: {err.get('message')}")