پاسخ های خطا

پاسخ های خطای استاندارد

اگر درخواست مدیریت API موفقیت آمیز باشد، API یک کد وضعیت 200 را برمی گرداند. اگر در یک درخواست خطایی رخ دهد، API کد وضعیت 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 نشان می دهد که پرس و جو نامعتبر بوده است. به عنوان مثال، شناسه والدین وجود نداشت یا ترکیبی از ابعاد یا معیارهای درخواستی معتبر نبود. بدون رفع مشکل دوباره امتحان نکنید. شما باید تغییراتی در پرس و جوی API ایجاد کنید تا بتواند کار کند.
401 invalidCredentials نشان می دهد که رمز تأیید نامعتبر است یا منقضی شده است. بدون رفع مشکل دوباره امتحان نکنید. شما باید یک نشانه تأیید جدید دریافت کنید.
403 insufficientPermissions نشان می دهد که کاربر مجوزهای کافی برای موجودیت مشخص شده در پرس و جو را ندارد. بدون رفع مشکل دوباره امتحان نکنید. برای انجام عملیات روی موجودیت مشخص شده باید مجوزهای کافی دریافت کنید.
403 dailyLimitExceeded نشان می دهد که کاربر از سهمیه روزانه فراتر رفته است (چه در هر پروژه و چه در هر بازدید (نمایه)). بدون رفع مشکل دوباره امتحان نکنید. سهمیه روزانه خود را تمام کرده اید. به محدودیت ها و سهمیه های API مراجعه کنید.
403 userRateLimitExceeded نشان می دهد که تعداد Queries در هر 100 ثانیه برای هر کاربر از حد مجاز فراتر رفته است. مقدار پیش فرض تنظیم شده در Google API Console 100 پرس و جو در هر 100 ثانیه برای هر کاربر است. می توانید این محدودیت را در Google API Console تا حداکثر 1000 افزایش دهید. با استفاده از عقب نشینی نمایی دوباره امتحان کنید. باید سرعت ارسال درخواست ها را کاهش دهید.
403 rateLimitExceeded نشان می دهد که درخواست های پروژه در هر 100 ثانیه از محدودیت های سرعت فراتر رفته است. با استفاده از عقب نشینی نمایی دوباره امتحان کنید. باید سرعت ارسال درخواست ها را کاهش دهید.
403 quotaExceeded نشان می دهد که به 10 درخواست همزمان برای هر نمایش (نمایه) در Core Reporting API رسیده است. با استفاده از عقب نشینی نمایی دوباره امتحان کنید. برای تکمیل این نما (نمایه) باید منتظر حداقل یک درخواست در حال انجام باشید.
500 internalServerError خطای سرور داخلی غیرمنتظره رخ داد. این پرس و جو را بیش از یک بار تکرار نکنید.
503 backendError سرور یک خطا برگرداند. این پرس و جو را بیش از یک بار تکرار نکنید.

رسیدگی به 500 یا 503 پاسخ

خطای 500 یا 503 ممکن است در هنگام بارگذاری سنگین یا برای درخواست های پیچیده تر بزرگتر ایجاد شود. برای درخواست های بزرگتر، درخواست داده برای مدت زمان کوتاه تری را در نظر بگیرید. همچنین پیاده سازی عقب نشینی نمایی را در نظر بگیرید. فراوانی این خطاها می تواند به نما (نمایه) و میزان گزارش داده های مرتبط با آن نمای بستگی داشته باشد. پرس و جوی که باعث ایجاد خطای 500 یا 503 برای یک نمای (نمایه) می شود، لزوماً برای همان پرس و جو با نمای متفاوت (نمایه) خطا ایجاد نمی کند.

پیاده سازی عقب نشینی نمایی

عقب نشینی نمایی فرآیندی است که در آن مشتری به طور دوره ای یک درخواست ناموفق را در مدت زمان فزاینده ای امتحان می کند. این یک استراتژی مدیریت خطای استاندارد برای برنامه های کاربردی شبکه است. مدیریت API با این انتظار طراحی شده است که مشتریانی که درخواست‌های ناموفق را مجدداً امتحان می‌کنند، این کار را با استفاده از عقب‌نشینی نمایی انجام دهند. علاوه بر "ضروری" بودن، استفاده از پس‌انداز نمایی، کارایی استفاده از پهنای باند را افزایش می‌دهد، تعداد درخواست‌های مورد نیاز برای دریافت پاسخ موفق را کاهش می‌دهد و توان عملیاتی درخواست‌ها را در محیط‌های همزمان به حداکثر می‌رساند.

جریان برای اجرای پس‌انداز نمایی ساده به شرح زیر است.

  1. یک درخواست به API بدهید
  2. پاسخ خطایی را دریافت کنید که دارای کد خطای قابل امتحان مجدد است
  3. 1 ثانیه + random_number_milliseconds ثانیه صبر کنید
  4. درخواست مجدد
  5. پاسخ خطایی را دریافت کنید که دارای کد خطای قابل امتحان مجدد است
  6. 2 ثانیه + random_number_milliseconds ثانیه صبر کنید
  7. درخواست مجدد
  8. پاسخ خطایی را دریافت کنید که دارای کد خطای قابل امتحان مجدد است
  9. 4 ثانیه + random_number_milliseconds ثانیه صبر کنید
  10. درخواست مجدد
  11. پاسخ خطایی را دریافت کنید که دارای کد خطای قابل امتحان مجدد است
  12. 8 ثانیه + random_number_milliseconds ثانیه صبر کنید
  13. درخواست مجدد
  14. پاسخ خطایی را دریافت کنید که دارای کد خطای قابل امتحان مجدد است
  15. 16 ثانیه + random_number_milliseconds ثانیه صبر کنید
  16. درخواست مجدد
  17. اگر باز هم با خطا مواجه شدید، توقف کرده و خطا را ثبت کنید.

در جریان فوق، random_number_milliseconds تعداد تصادفی میلی ثانیه کمتر یا مساوی 1000 است. این برای جلوگیری از خطاهای قفل خاص در برخی از پیاده سازی های همزمان ضروری است. random_number_milliseconds باید بعد از هر انتظار دوباره تعریف شود.

توجه : انتظار همیشه (2 ^ n) + random_number_milliseconds است، که در آن n یک عدد صحیح افزایشی یکنواخت است که در ابتدا 0 تعریف شده است. n برای هر تکرار (هر درخواست) 1 افزایش می یابد.

الگوریتم تنظیم شده است تا زمانی که n 5 باشد خاتمه یابد. این سقف فقط برای جلوگیری از تلاش مجدد مشتریان برای بی نهایت وجود دارد و منجر به تأخیر کلی حدود 32 ثانیه قبل از تلقی درخواست "خطای غیرقابل جبران" می شود.

کد پایتون زیر پیاده سازی جریان فوق برای بازیابی خطاهایی است که در روشی به نام 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."