معالجة أخطاء واجهة برمجة التطبيقات

تعرض Google Calendar API مستويَين من معلومات الخطأ:

  • رموز الخطأ ورسائله في عنوان HTTP
  • عنصر JSON في نص الاستجابة يتضمّن تفاصيل إضافية يمكن أن تساعدك في تحديد كيفية التعامل مع الخطأ.

يوفّر باقي هذه الصفحة مرجعًا لأخطاء "تقويم Google"، مع بعض الإرشادات حول كيفية التعامل معها في تطبيقك.

تنفيذ خوارزمية الرقود الأسي الثنائي

توضّح مستندات Google Cloud Storage خوارزمية الرقود الأسي الثنائي وكيفية استخدامها مع Google APIs.

الأخطاء والإجراءات المقترَحة

يوفّر هذا القسم التمثيل الكامل بتنسيق JSON لكل خطأ مُدرَج والإجراءات المقترَحة التي يمكنك اتّخاذها للتعامل معه.

400: طلب غير صالح

خطأ مستخدم. يحدث هذا الخطأ عندما لا تقدّم حقلًا أو مَعلمة مطلوبة، أو تقدّم قيمة غير صالحة، أو تقدّم مجموعة غير صالحة من الحقول.

{
  "error": {
    "errors": [
      {
        "domain": "calendar",
        "reason": "timeRangeEmpty",
        "message": "The specified time range is empty.",
        "locationType": "parameter",
        "location": "timeMax"
      }
    ],
    "code": 400,
    "message": "The specified time range is empty."
  }
}

الإجراء المقترَح: هذا الخطأ دائم، لذا لا تحاول إعادة المحاولة. بدلاً من ذلك، اقرأ رسالة الخطأ وغيِّر طلبك وفقًا لذلك.

‫401: بيانات اعتماد غير صالحة

عنوان التفويض غير صالح. انتهت صلاحية رمز الدخول الذي تستخدمه أو أنّه غير صالح.

{
  "error": {
    "errors": [
      {
        "domain": "global",
        "reason": "authError",
        "message": "Invalid Credentials",
        "locationType": "header",
        "location": "Authorization"
      }
    ],
    "code": 401,
    "message": "Invalid Credentials"
  }
}

الإجراءات المقترَحة:

  • احصل على رمز دخول جديد باستخدام الرمز المميز لإعادة التحميل الطويل الأمد.
  • إذا تعذّر ذلك، وجِّه المستخدم خلال مسار OAuth، كما هو موضّح في تفويض الطلبات باستخدام OAuth 2.0.
  • إذا حدث هذا الخطأ لحساب خدمة، تأكَّد من أنّك أكملت بنجاح جميع الخطوات في صفحة حساب الخدمة.

‫403: تم تجاوز الحدّ الأقصى لمعدّل الإرسال لكل مستخدم

تم بلوغ أحد الحدود القصوى من Google Cloud Console.

{
  "error": {
    "errors": [
      {
        "domain": "usageLimits",
        "reason": "userRateLimitExceeded",
        "message": "User Rate Limit Exceeded"
      }
    ],
    "code": 403,
    "message": "User Rate Limit Exceeded"
  }
}

الإجراءات المقترَحة:

‫403: تم تجاوز الحدّ الأقصى لمعدّل الإرسال

لقد بلغ المستخدم الحدّ الأقصى لمعدّل طلبات Calendar API لكل تقويم أو لكل مستخدم تم التحقّق من هويته.

{
  "error": {
    "errors": [
      {
        "domain": "usageLimits",
        "reason": "rateLimitExceeded",
        "message": "Rate Limit Exceeded"
      }
    ],
    "code": 403,
    "message": "Rate Limit Exceeded"
  }
}

الإجراء المقترَح: يمكن أن تعرض أخطاء rateLimitExceeded رموز الخطأ 403 أو 429 ، وهي متشابهة من الناحية الوظيفية ويجب التعامل معها بالطريقة نفسها ، باستخدام خوارزمية الرقود الأسي الثنائي. بالإضافة إلى ذلك، تأكَّد من أنّ تطبيقك يتّبع أفضل الممارسات من إدارة الحصص.

‫403: تم تجاوز الحدود القصوى لاستخدام "تقويم Google"

لقد بلغ المستخدم أحد الحدود القصوى لـ "تقويم Google" التي تم وضعها لحماية مستخدمي Google وبنيتها الأساسية من سلوكيات إساءة الاستخدام.

{
  "error": {
    "errors": [
      {
        "domain": "usageLimits",
        "message": "Calendar usage limits exceeded.",
        "reason": "quotaExceeded"
      }
    ],
    "code": 403,
    "message": "Calendar usage limits exceeded."
  }
}

الإجراءات المقترَحة:

‫403: محظور على غير المنظِّم

يحاول طلب تعديل الحدث ضبط إحدى خصائص الحدث المشترَكة في نسخة ليست نسخة المنظِّم. لا يمكن سوى للمنظِّم ضبط الخصائص المشترَكة (على سبيل المثال، guestsCanInviteOthers أو guestsCanModify أو guestsCanSeeOtherGuests).

{
  "error": {
    "errors": [
      {
        "domain": "calendar",
        "reason": "forbiddenForNonOrganizer",
        "message": "Shared properties can only be changed by the organizer of the event."
      }
    ],
    "code": 403,
    "message": "Shared properties can only be changed by the organizer of the event."
  }
}

الإجراءات المقترَحة:

  • إذا كنت تستخدم Events: insert، Events: import، أو Events: update، ولا يتضمّن طلبك أي خصائص مشترَكة، يكون ذلك مكافئًا لمحاولة ضبطها على قيمها التلقائية. ننصحك باستخدام Events: patch بدلاً من ذلك.
  • إذا كان طلبك يتضمّن خصائص مشترَكة، تأكَّد من أنّك تحاول تغيير هذه الخصائص فقط إذا كنت تعدِّل نسخة المنظِّم.

‫404: لم يتم العثور على الصفحة

لم يتم العثور على المورد المحدّد. يمكن أن يحدث ذلك في عدة حالات. وإليك بعض الأمثلة:

  • عندما لم يكن المورد المطلوب (بالرقم التعريف المقدَّم) موجودًا من قبل.
  • عند الوصول إلى تقويم لا يمكن للمستخدم الوصول إليه.
{
  "error": {
    "errors": [
      {
        "domain": "global",
        "reason": "notFound",
        "message": "Not Found"
      }
    ],
    "code": 404,
    "message": "Not Found"
  }
}

الإجراء المقترَح: استخدِم خوارزمية الرقود الأسي الثنائي.

‫409: المعرّف المطلوب موجود مسبقًا

تتوفّر في مساحة التخزين نسخة بالرقم التعريف المقدَّم.

{
  "error": {
    "errors": [
      {
        "domain": "global",
        "reason": "duplicate",
        "message": "The requested identifier already exists."
      }
    ],
    "code": 409,
    "message": "The requested identifier already exists."
  }
}

الإجراء المقترَح: أنشئ رقم تعريف جديدًا إذا كنت تريد إنشاء نسخة جديدة، وإلا استخدِم طريقة events.update.

‫409: تعارض

لا يمكن تنفيذ عنصر مجمّع داخل عملية events.batch بسبب تعارض تشغيلي مع عناصر مجمّعة أخرى مطلوبة.

{
  "error": {
    "errors": [
      {
        "domain": "global",
        "reason": "conflict",
        "message": "Conflict"
      }
    ],
    "code": 409,
    "message": "Conflict"
  }
}

الإجراء المقترَح: أزِل العناصر المكتملة والفاشلة، ثم أعِد محاولة العناصر المتبقية في عملية events.batch مختلفة أو عمليات أحداث فردية مقابلة.

‫410: Gone

لم تعُد المَعلمتان syncToken أو updatedMin صالحتَين. يمكن أن يحدث هذا الخطأ أيضًا إذا حاول طلب حذف حدث تم حذفه من قبل.

{
  "error": {
    "errors": [
      {
        "domain": "calendar",
        "reason": "fullSyncRequired",
        "message": "Sync token is no longer valid, a full sync is required.",
        "locationType": "parameter",
        "location": "syncToken"
      }
    ],
    "code": 410,
    "message": "Sync token is no longer valid, a full sync is required."
  }
}

أو

{
  "error": {
    "errors": [
      {
        "domain": "calendar",
        "reason": "updatedMinTooLongAgo",
        "message": "The requested minimum modification time lies too far in the past.",
        "locationType": "parameter",
        "location": "updatedMin"
      }
    ],
    "code": 410,
    "message": "The requested minimum modification time lies too far in the past."
  }
}

أو

{
  "error": {
    "errors": [
      {
        "domain": "global",
        "reason": "deleted",
        "message": "Resource has been deleted"
      }
    ],
    "code": 410,
    "message": "Resource has been deleted"
  }
}

الإجراء المقترَح: بالنسبة إلى المَعلمتَين syncToken أو updatedMin، امحُ مساحة التخزين وأعِد المزامنة. لمزيد من التفاصيل، يُرجى الاطّلاع على مقالة مزامنة الموارد بكفاءة. بالنسبة إلى الأحداث التي تم حذفها من قبل، لا يلزم اتّخاذ أي إجراء إضافي.

‫412: Precondition Failed

لم يعُد رمز ETag المقدَّم في عنوان If-Match يتطابق مع رمز ETag الحالي للمورد.

{
  "error": {
    "errors": [
      {
        "domain": "global",
        "reason": "conditionNotMet",
        "message": "Precondition Failed",
        "locationType": "header",
        "location": "If-Match"
      }
    ],
    "code": 412,
    "message": "Precondition Failed"
  }
}

الإجراء المقترَح: أعِد جلب الكيان وأعِد تطبيق التغييرات. لمزيد من التفاصيل، يُرجى الاطّلاع على مقالة الحصول على إصدارات معيّنة من الموارد.

‫429: عدد الطلبات كبير جدًا

يحدث الخطأ rateLimitExceeded عندما يرسل المستخدم عددًا كبيرًا جدًا من الطلبات خلال فترة زمنية معيّنة.

{
  "error": {
    "errors": [
      {
        "domain": "usageLimits",
        "reason": "rateLimitExceeded",
        "message": "Rate Limit Exceeded"
      }
    ],
    "code": 429,
    "message": "Rate Limit Exceeded"
  }
}

الإجراء المقترَح: يمكن أن تعرض أخطاء rateLimitExceeded رموز الخطأ 403 أو 429 ، وهي متشابهة من الناحية الوظيفية ويجب التعامل معها بالطريقة نفسها ، باستخدام خوارزمية الرقود الأسي الثنائي. بالإضافة إلى ذلك، تأكَّد من أنّ تطبيقك يتّبع أفضل الممارسات من إدارة الحصص.

‫500: خطأ في الواجهة الخلفية

حدث خطأ غير متوقَّع أثناء معالجة الطلب.

{
  "error": {
    "errors": [
      {
        "domain": "global",
        "reason": "backendError",
        "message": "Backend Error"
      }
    ],
    "code": 500,
    "message": "Backend Error"
  }
}

الإجراء المقترَح: استخدِم خوارزمية الرقود الأسي الثنائي.