أخطاء المُحلِّل تصل مع HTTP 200
هذا أهم شيء يجب معرفته قبل كتابة شيفرة معالجة الأخطاء. وفقًا لمواصفة GraphQL over HTTP، يُرجع الطلب الذي يصل إلى المُحلِّلات لدينا HTTP 200 حتى عندما تفشل عملية ما. يُبلَغ عن الفشل داخل جسم الاستجابة، وليس عبر رمز الحالة. لذا فإن هذا التحقق لا يعمل:Content-Type غير مدعوم، يكون جسمها فارغًا، لذا تحقّق من أن الاستجابة بصيغة JSON قبل تحليلها:
- يُرجع الطلب غير الصحيح حالة خطأ: HTTP 400 لـ JSON غير صالح أو غياب
query، و413 لجسم يتجاوز 64 KB، و405 لطريقة غيرPOST، و415 لـContent-Typeغير مدعوم. - يُرجع الاستعلام غير الصالح وفقًا للمخطط HTTP 400 فقط إذا أرسل طلبك
Accept: application/graphql-response+json. ويشمل ذلك خطأ الصياغة، والحقل غير المعروف، ونوع الوسيط الخاطئ، وقيمة التعداد غير الصالحة، والاستعلام الذي يتجاوز حدود الاستعلام. إذا أرسلتAccept: application/json، أو لم ترسل ترويسةAccept، فإن الخطأ نفسه يُرجع HTTP 200. وفي كلتا الحالتين، يحتوي الجسم على مصفوفةerrorsدونdata.
errors.
شكل الخطأ
يحمل كل خطأ من أخطاء المُحلِّل حالة API الشبيهة بحالة HTTP فيextensions:
message: وصف مقروء للبشر. نُزيل مفاتيح API وبيانات الاعتماد الأخرى من رسائل أخطاء المُحلِّل، لكن الخطأ المتعلق بقيمة أرسلتها، مثل متغير من نوع خاطئ، قد يكرر تلك القيمة. تعامل معmessageعلى أنها قد تكون حساسة قبل تسجيلها.path: الحقل الذي فشل في استعلامك. عند وجود عدة حقول في طلب واحد، هذه هي الطريقة لمعرفة أيّها فشل.extensions.status: حالة HTTP التي كان سيُرجعها استدعاء REST المكافئ. اعتمد على هذه القيمة في التفرّع.extensions.code: رمز خطأ Ayrshare الرقمي، عندما توفّره نقطة النهاية الأساسية.extensions.retryAfter: يظهر في استجابات 429 الخاصة بالحصة أو حدود المعدل في الخدمات الأصلية عندما يتوفر تأخير لإعادة المحاولة. ولا يظهر في استجابة 429 الخاصة بميزانية الإرسال لكل طلب.
extensions.code مع مرجع رموز الأخطاء، أو مرّره إلى explainError.
النجاح الجزئي
إذا طلب الطلب عدة أشياء ونجح بعضها فقط، فستحصل علىdata وerrors معًا:
history وبياناته قابلة للاستخدام. فقط analytics يحتاج إلى إعادة المحاولة. لا تتجاهل الاستجابة بأكملها بسبب وجود errors، فذلك سيُهدر بيانات سبق أن دفعت مقابلها.
النجاح الجزئي في المنشورات متعددة الشبكات
قد ينجح المنشور المُرسَل إلى عدة شبكات على بعضها ويفشل على أخرى. لا يُبلَغ عن ذلك كخطأ GraphQL، لأن العملية نفسها نجحت؛ فقد نفّذت ما طلبته بالضبط وهي تخبرك بما حدث. تفصل النتيجة بين النتائج الثلاث:postIds: الشبكات التي تم النشر عليها، مع عناوين URL لمنشوراتها. حالات النجاح فقط.errors: الشبكات التي فشل النشر عليها، مع السبب.blocked: الشبكات التي أُوقفت قبل أي محاولة، على سبيل المثال بواسطة قاطع الدائرة الخاص بكل شبكة بعد حالات فشل حتمية متكررة. وهي منفصلة عن محاولات المزوّد التي أرجعت أخطاء.
status هي "error" إذا فشلت أي شبكة، لذا فهي ليست مؤشرًا موثوقًا على أنه لم يُنشر شيء. اقرأ postIds لمعرفة ما تم نشره.
إعادة المحاولة
لا تعيد GraphQL API المحاولة تلقائيًا أبدًا. إذا فشل طلب، فلم تُجرَ أي محاولة أخرى بصمت نيابةً عنك. يهم هذا أكثر ما يهم في الطفرات. يُتيحcreatePost الحقل idempotencyKey: أنشئ مفتاحًا فريدًا قبل المحاولة الأولى، ثم أعد استخدام المفتاح نفسه والحمولة المطابقة في كل إعادة محاولة. تُعيد إعادة المحاولة بعد استقرار الطلب النتيجة الأصلية بدلًا من تكرار عملية الكتابة. لا تنتقل إلى مفتاح جديد بعد استجابة غامضة.
يأخذ boostFacebookPost وinstagramBoostPost أيضًا idempotencyKey، وهو يحمي أموالًا حقيقية. تُرجع إعادة المحاولة بالمفتاح نفسه والوسائط نفسها النتيجة الأصلية، مع العلامة idempotentReplayed: true، بدلًا من إنشاء إعلان ثانٍ ودفع ثمنه. يغطي المفتاح الواحد حسابك بأكمله على منصتي Meta كلتيهما، لذا لا تُعِد أبدًا استخدام مفتاح ترويج Facebook لترويج Instagram.
عند رفض مفتاح، تخبرك extensions.status بالسبب. يُرجع createPost الرمز 409 أثناء استمرار معالجة المحاولة الأولى، لذا انتظر وأعد المحاولة بالمفتاح نفسه، ويُرجع 400 عندما تختلف الحمولة عن المحاولة الأولى. تُرجع طفرات الترويج 409 في الحالتين، وكذلك عندما يكون المفتاح قد استُخدم لترويج على المنصة الأخرى.
عمليات الكتابة الأخرى، مثل addComment، ليس لها مفتاح منع تكرار. إذا فُقدت استجابتها، فتحقّق من الشبكة الاجتماعية أو من حالة API قبل أن تقرر ما إذا كانت محاولة أخرى آمنة.
هناك حدّان مختلفان يُبلغ كلاهما عن 429، ويتطلبان معالجة مختلفة. لا ترفض ميزانية الإرسال الحقول الجذرية إلا بعد أن تبدأ خمسة استدعاءات API بالفعل في الطلب نفسه، وتبدأ رسالتها بـ Query exceeds the per-request dispatch budget: قسّم تلك الحقول إلى طلبات لا يتجاوز كل منها خمسة، دون حاجة إلى الانتظار. أما أي 429 آخر فهو حد معدل أو حصة: انتظر extensions.retryAfter ثانية عند وجوده، وإلا فتراجع قبل إعادة المحاولة، وأعد المحاولة للحقول التي فشلت فقط. بالنسبة إلى 5xx في عملية قراءة، تكون إعادة المحاولة آمنة، مع استثناء واحد: generatePost هو استعلام، لكن إعادة المحاولة تستدعي مولّد الذكاء الاصطناعي مرة أخرى، وتُحتسب كاستدعاء API آخر، وتُرجع نصًا مختلفًا. وبالنسبة إلى 5xx في عملية كتابة دون منع تكرار، تحقّق مما إذا كانت قد نُفّذت قبل إعادة المحاولة.
الحالات الشائعة
الأخطاء التي تُطلقها GraphQL نفسها قبل التنفيذ، مثل الحقل غير المعروف أو نوع الوسيط الخاطئ أو قيمة التعداد غير الصالحة، ليس لها
extensions.status. وتُرجع HTTP 400 أو 200 بحسب ترويسة Accept لديك، كما هو موضح أعلاه. وهي تعني أن الاستعلام نفسه خاطئ، ولم يُجرَ أي استدعاء API ولم تتم فوترته.