الأخطاء

الأخطاء بصيغة JSON، مثل كل شيء آخر، مع رمز حالة HTTP مطابق ورمز يمكنك التفرّع عليه. الرسالة جملة مخصصة لسجلاتك لا لمستخدميك، وقد تتغير صياغتها، أما الرمز فلن يتغير أبدًا.

غلاف الخطأ

{
  "status": "error",
  "error": {
    "code": "invalid_request",
    "message": "Parameter 'lat' must be a number between -90 and 90.",
    "param": "lat"
  }
}

يكون param موجودًا عندما يتسبب معامل محدد في المشكلة. تُضبط X-Request-Id في استجابات الخطأ أيضًا، فأدرجها إذا تواصلت مع الدعم.

الرموز

HTTPcodeمتىما العمل
400invalid_requestمعامل مطلوب مفقود، أو قيمة مشوّهة الصيغة أو خارج النطاق، أو أكثر من 100 نقطة أو عنوان في دفعة واحدة، أو طلب أكثر من 10 نتيجة.أصلح الطلب. لا تُعد المحاولة دون تغيير.
401missing_keyلم يُرسل أي مفتاح والوصول دون مفتاح معطّل على هذا الخادم. هو مفعّل افتراضيًا، ويُجاب الطلب دون مفتاح ببساطة.أرسل مفتاحًا في X-API-Key أو رمز bearer أو key=.
429quota_exceededاستنفد العنوان طلباته المجانية البالغة 2,500 لليوم دون مفتاح.انتظر إعادة التصفير (توضح Retry-After وX-Quota-Reset موعدها)، أو أرسل مفتاحًا يحمل رصيدًا أو باقة Unlimited.
401invalid_keyالمفتاح غير موجود.تحقق من وجود أخطاء إملائية أو نسخ منقوص.
401key_revokedأُلغي المفتاح من لوحة التحكم.استخدم مفتاحًا ساريًا.
402no_creditsاستُنفدت الحصة المجانية للمفتاح لهذا اليوم ورصيد الحساب فارغ.أضف رصيدًا من لوحة التحكم، بالبطاقة أو بالعملات المشفرة، أو انتظر إعادة التصفير.
403key_ip_limitجميع خانات IP لهذا المفتاح تشغلها عناوين أخرى في الفترة القادمة.استخدم أحد الأجهزة التي تشغل الخانات، أو امنح هذا الجهاز مفتاحه الخاص، أو أضف باقة. راجع خانات IP.
403account_suspendedالحساب موقوف.تحقق من رسائل البريد الإلكتروني الواردة منا أو افتح تذكرة.
404not_foundالمسار غير موجود. الاستعلام الذي لا يطابق شيئًا يعيد 200 مع نتائج فارغة، لا 404.تحقق من المسار وبادئة الإصدار.
500server_errorحدث عطل من جانبنا.أعد المحاولة مرة واحدة بعد ثانية. يُسجَّل الخطأ وينبّهنا. لا يُحتسب.
503unavailableإحدى الخدمات الخلفية غير متاحة مؤقتًا.أعد المحاولة مع تأخير متزايد. لا يُحتسب.

أمور ليست أخطاء

الأخطاء على المضيفات البديلة المتوافقة

تعيد مضيفات التوافق الأخطاء بالشكل الذي يستخدمه المزوّد الأصلي، لذا تعمل المعالجة الحالية. على سبيل المثال، يكون الرصيد الفارغ "status": "OVER_QUERY_LIMIT" مع HTTP 200 على gapi.mygeocode.com، و"statusCode": 429 في غلاف Bing على bing.mygeocode.com، و{"status":"fail","message":"quota"} على ipapi.mygeocode.com، أما المفتاح الخاطئ فيكون REQUEST_DENIED و401 وinvalid key على الترتيب. تُرسل ترويسات X-Quota-* على كل مضيف في جميع الأحوال، لذا يمكنك قراءة الحالة الحقيقية من الترويسات إن أردت.

استراتيجية معقولة للتعامل

def call(url, params, tries=3):
    for attempt in range(tries):
        r = session.get(url, params=params, timeout=10)
        if r.status_code == 200:
            return r.json()
        body = r.json()
        code = body["error"]["code"]
        if r.status_code in (500, 503):
            time.sleep(0.2 * (2 ** attempt))
            continue
        # no_credits, key_ip_limit, invalid_request, invalid_key: retrying will not help
        raise ApiError(code, body["error"]["message"], r.headers.get("X-Request-Id"))
    raise ApiError("retries_exhausted", "Gave up after %d attempts" % tries, None)