الأخطاء وحدود الاستخدام

أمران يفاجئان من يتعامل مع واجهة GraphQL لأول مرة: العملية الفاشلة تعيد عادةً رمز 200، وأهم الأخطاء ليست أخطاءً أصلاً بل قيماً يُفترض أن تقرأها.

ثلاثة أنواع من الفشل

النوعكيف تراهما العمل
النقلرمز غير 200: 401 لمفتاح خاطئ أو ملغى، و429 عند تجاوز الحد، و5xx إن كان الخلل عندنا.عالجه قبل تحليل جسم الاستجابة.
الطلبرمز 200 مع مصفوفة `errors` — استعلام غير سليم، أو حقل مجهول، أو صلاحية ناقصة.خلل في تكاملك، أو صلاحية لم تُمنح لك. توقّف ونبّه.
المتوقعرمز 200 بلا `errors`، والعملية تعيد نوعاً غير نوع النجاح.نتيجة طبيعية. تفرّع بناءً عليها.

الفشل المتوقع قيمة لا استثناء

كثير من العمليات تعيد اتحاداً من نوع نجاح ونوع خطأ أو أكثر بدل أن ترمي استثناءً. وطلب `__typename` والتفرّع عليه هو الطريقة المقصودة لاستخدامها — فطلب لا يستطيع الانتقال إلى الحالة التي طلبتها هو واقعة عن الطلب لا عطل.

graphql
mutation {
  transitionOrderToState(id: "1024", state: "Shipped") {
    __typename
    ... on Order { id state }
    ... on OrderStateTransitionError {
      errorCode        # e.g. ORDER_STATE_TRANSITION_ERROR
      message
      fromState
      toState
      transitionError
    }
  }
}
إن قرأت حقول النجاح فقط وتجاهلت `__typename`، فستعود هذه الحالات قيماً فارغة تبدو كبيانات خالية. وهذه أشيع طريقة يتوقف بها تكامل عن العمل بصمت.

رفض الصلاحيات

استدعاء عملية لم يُمنح مفتاحك صلاحيتها يعيد رمز 200 مع خطأ صلاحية في مصفوفة `errors`. ليس خللاً ولن تفيد إعادة المحاولة — على التاجر أن يصدر مفتاحاً بالصلاحية التي تحتاجها.

حدود الاستخدام

تُحدّ حركة المفاتيح مرتين ضمن نافذة متحركة مدتها دقيقة: لكل مفتاح، ثم لكل مفتاح مع عنوان المصدر معاً. والسقف الأعلى هو سقف المفتاح، لذا فتوزيع المفتاح نفسه على عدة أجهزة لا يمنحك سعة أكبر.

الحدطلبات في الدقيقة
لكل مفتاح600
لكل مفتاح وعنوان مصدر300

تُحتسب طلبات POST الحاملة لمفتاح فقط. أما التاجر الذي يتصفح لوحته فيستوثق بجلسة لا بمفتاح، فلا يستهلك تصفّحه حصتك، ولا يستطيع تكاملك إبطاء لوحته.

التعامل مع 429

http
HTTP/1.1 429 Too Many Requests
Retry-After: 60
Content-Type: application/json

{
  "errorCode": "RATE_LIMITED",
  "message": "Too many API requests — please retry shortly."
}
  1. اقرأ Retry-After، وهو عدد الثواني حتى تُصفَّر النافذة.
  2. انتظر هذه المدة على الأقل. فإعادة المحاولة فوراً تستهلك النافذة التالية أيضاً.
  3. تراجع أسّياً إن تكرر الأمر، وأضف تشتيتاً عشوائياً — فعدة عمّال يعيدون المحاولة في اللحظة نفسها يعيدون إنتاج الاندفاع الذي تسبب بالحد.
  4. عامل تكرار 429 المستمر كمشكلة تصميم لا كعارض: اجمع قراءاتك دفعةً واحدة، أو اشترك في الويب هوك بدل الاستجواب المتكرر.
الحدود لكل مفتاح لا لكل صلاحية، ويتقاسمها كل ما يفعله المفتاح. ولا توجد حصة منفصلة لكل صلاحية. وإن كانت حالتك تحتاج فعلاً سقفاً أعلى فاطلب ذلك — ولا توزّع الحمل على عناوين إضافية.