تسرد هذه الصفحة الأخطاء التي قد تظهر لك من User Deletion API، وتشرح كيفية التعامل مع 500 خطأ وتنفيذ التراجع الأسي.
الردود المعيارية على الأخطاء
إذا كان طلب User Deletion API ناجحًا، تعرض واجهة برمجة التطبيقات رمز الحالة 200
.
في حال حدوث خطأ في أحد الطلبات، تعرض واجهة برمجة التطبيقات رمز حالة HTTP والحالة
والسبب في الاستجابة استنادًا إلى نوع الخطأ. بالإضافة إلى ذلك، يحتوي نص الردّ على وصف مفصّل لسبب الخطأ. في ما يلي مثال
على استجابة خطأ:
{ "error": { "errors": [ { "domain": "global", "reason": "invalidParameter",
"message": "Invalid value '-1' for max-results. Value must be within the range:
[1, 1000]", "locationType": "parameter", "location": "max-results" } ], "code":
400, "message": "Invalid value '-1' for max-results. Value must be within the
range: [1, 1000]" } }
جدول الأخطاء
الرمز | السبب | الوصف | الإجراء المقترَح |
---|---|---|---|
400 | invalidParameter |
يشير إلى أن معلَمة الطلب بها قيمة غير صالحة. يقدّم الحقلان locationType وlocation في استجابة الخطأ معلومات عن القيمة غير الصالحة. |
لا تُعد المحاولة بدون حلّ المشكلة. عليك تقديم قيمة صالحة للمَعلمة المحدّدة في ردّ الخطأ. |
400 | badRequest |
يشير إلى أنّ طلب البحث غير صالح. على سبيل المثال، لم يكن معرّف العنصر الرئيسي متوفّرًا أو لم تكن مجموعة السمات أو المقاييس المطلوبة صالحة. | لا تُعد المحاولة بدون حلّ المشكلة. عليك إجراء تغييرات على طلب البحث في واجهة برمجة التطبيقات لكي يعمل. |
401 | invalidCredentials |
يشير إلى أن الرمز المميز للمصادقة غير صالح أو منتهي الصلاحية. | لا تُعد المحاولة بدون حلّ المشكلة. عليك الحصول على رمز مميّز جديد لمنح الأذونات. |
403 | insufficientPermissions |
يشير إلى أنّ المستخدم لا يملك الأذونات الكافية للكيان المحدّد في طلب البحث. | لا تُعد المحاولة بدون حلّ المشكلة. يجب الحصول على أذونات كافية لتنفيذ العملية على العنصر المحدّد. |
403 | dailyLimitExceeded |
يشير إلى أن المستخدم قد تجاوز الحصة اليومية (إما لكل مشروع أو لكل ملف شخصي). | لا تُعد المحاولة بدون حلّ المشكلة. لقد استهلكت حصتك اليومية. اطّلِع على حدود واجهة برمجة التطبيقات وحصصها. |
403 | userRateLimitExceeded |
يشير ذلك إلى تجاوز الحد الأقصى للطلبات كل 100 ثانية لكل مستخدم. القيمة التلقائية التي تم ضبطها في "وحدة تحكّم واجهة برمجة التطبيقات في Google" هي 100 طلب بحث كل 100 ثانية لكل مستخدم. يمكنك زيادة هذا الحدّ في وحدة تحكّم Google API إلى 1,000 كحدّ أقصى. | أعِد المحاولة باستخدام التراجع الدليلي. عليك إبطاء معدّل إرسال الطلبات. |
403 | rateLimitExceeded |
يشير ذلك إلى تجاوز حدود معدل طلبات البحث في كل 100 ثانية للمشروع. | أعِد المحاولة باستخدام التراجع الدليلي. عليك إبطاء معدّل إرسال الطلبات. |
403 | quotaExceeded |
يشير ذلك إلى أنّه تمّ الوصول إلى 10 طلبات متزامنة لكلّ عرض (ملفّ شخصي) في Core Reporting API. | يُرجى إعادة المحاولة باستخدام خوارزمية الرقود الأسي الثنائي. عليك الانتظار حتى اكتمال طلب واحد على الأقلّ قيد التقدّم لهذا العرض (الملف الشخصي). |
500 | internalServerError |
حدث خطأ غير متوقَّع في الخادم الداخلي. | لا تحاول إجراء هذا الاستعلام أكثر من مرة. |
503 | backendError |
عرَض الخادم خطأ. | لا تحاول إجراء هذا الاستعلام أكثر من مرة. |
التعامل مع الردود 500 أو 503
قد يحدث خطأ 500
أو 503
أثناء التحميل المكثّف أو عند تلقّي طلبات أكبر وأكثر تعقيدًا. بالنسبة إلى الطلبات الأكبر حجمًا، ننصحك بطلب البيانات لفترة زمنية
أقصر. ننصحك أيضًا بتنفيذ خوارزمية الرقود الأسي. يمكن أن تعتمد تكرار هذه الأخطاء على طريقة العرض (الملف الشخصي) وكمية بيانات إعداد التقارير المرتبطة بهذه الطريقة. ولن يؤدي طلب البحث الذي يتسبب في خطأ 500
أو
503
لطريقة عرض (ملف شخصي) واحدة إلى حدوث خطأ بالضرورة لطلب البحث نفسه في طريقة عرض (ملف شخصي) مختلفة.
تنفيذ خوارزمية الرقود الأسي
"الرقود الأسي الثنائي" هي عملية يعيد فيها العميل بشكل دوري محاولة إرسال طلب تعذّر تنفيذه على مدار فترة زمنية متزايدة. إنها إستراتيجية معيارية للتعامل مع الأخطاء لتطبيقات الشبكة. تم تصميم User Deletion API مع الأخذ في الاعتبار أنّ العملاء الذين يختارون إعادة محاولة الطلبات التي تعذّر إكمالها سيفعلون ذلك باستخدام التراجع الدليلي. بالإضافة إلى أنّه "مطلوب"، يؤدي استخدام التراجع الدليلي إلى زيادة كفاءة استخدام معدل نقل البيانات، وخفض عدد الطلبات المطلوبة للحصول على استجابة ناجحة، وزيادة معدل نقل البيانات إلى أقصى حدّ في البيئات المتزامنة.
في ما يلي كيفية تنفيذ خوارزمية الرقود الأسي الثنائي:
- أرسِل طلبًا إلى واجهة برمجة التطبيقات.
- استلام ردّ يفيد بحدوث خطأ يتضمّن رمز خطأ يمكن إعادة المحاولة
- الانتظار لمدّة ثانية واحدة و
random_number_milliseconds
ثانية - يُرجى إعادة محاولة إرسال الطلب.
- استلام ردّ يفيد بحدوث خطأ يتضمّن رمز خطأ يمكن إعادة المحاولة
- انتظِر لمدة 2 ثانية +
random_number_milliseconds
ثانية. - يُرجى إعادة محاولة إرسال الطلب.
- استلام ردّ يفيد بحدوث خطأ يتضمّن رمز خطأ يمكن إعادة المحاولة
- انتظِر لمدة 4 ثوانٍ +
random_number_milliseconds
ثانية. - يُرجى إعادة محاولة إرسال الطلب.
- استلام ردّ يفيد بحدوث خطأ يتضمّن رمز خطأ يمكن إعادة المحاولة
- الانتظار لمدّة 8 ثوانٍ و
random_number_milliseconds
ثانية - يُرجى إعادة محاولة إرسال الطلب.
- استلام ردّ يفيد بحدوث خطأ يتضمّن رمز خطأ يمكن إعادة المحاولة
- انتظِر لمدة 16 ثانية +
random_number_milliseconds
ثانية. - إعادة محاولة الطلب.
- إذا استمر ظهور الخطأ، أوقِف عملية الربط وسجِّل الخطأ.
في العملية السابقة، random_number_milliseconds
هو عدد عشوائي من
المللي ثانية أقل من أو يساوي 1000. هذا الإجراء ضروري لتجنُّب أخطاء
القفل في بعض عمليات التنفيذ المتزامنة. يجب إعادة تحديد random_number_milliseconds
بعد كل انتظار.
يتم ضبط الخوارزمية لإنهاء العملية عندما يكون n يساوي 5. يتم تطبيق هذا الحدّ الأقصى فقط لمنع العملاء من إعادة المحاولة بشكلٍ لا نهائي، ويؤدي ذلك إلى تأخير إجمالي مدّته حوالي 32 ثانية قبل اعتبار الطلب "خطأً لا يمكن تصحيحه".
رمز Python التالي هو تنفيذ للمسار السابق لمحاولة
استرداد الأخطاء التي تحدث في طريقة تُسمى makeRequest
.
import random
import time
from apiclient.errors import HttpError
def makeRequestWithExponentialBackoff(analytics):
"""Wrapper to request Google Analytics data with exponential backoff.
The makeRequest method accepts the analytics service object, makes API
requests and returns the response. If any error occurs, the makeRequest
method is retried using exponential backoff.
Args:
analytics: The analytics service object
Returns:
The API response from the makeRequest method.
"""
for n in range(0, 5):
try:
return makeRequest(analytics)
except HttpError, error:
if error.resp.reason in ['userRateLimitExceeded', 'quotaExceeded',
'internalServerError', 'backendError']:
time.sleep((2 ** n) + random.random())
else:
break
print "There has been an error, the request never succeeded."