دليل

محاكاة استجابة API على جهاز حقيقي

أجب عن أحد استدعاءات API في تطبيقك باستجابة جاهزة — على الهاتف الذي في يدك، بلا خادم وهمي ولا إعادة بناء. قاعدة حظر من نوع Mock لمحتوى ثابت، وحدّ تنفيذ عندما يجب أن تعمل مرة واحدة بالضبط، وسكربت عندما يجب حساب المحتوى.

المحاكاة على جهاز حقيقي هي حيث تنهار معظم الإعدادات: خادم المحاكاة يعيش على حاسوب محمول، وعلى الهاتف الوصول إليه، وعلى التطبيق أن يُوجَّه إليه. يضع Busymate DevTools المحاكاة في مسار الالتقاط نفسه بدلًا من ذلك. تراقب قاعدة الحظر كل طلب يطابق طريقة ونمط مضيف-ومسار، وتجيب عن المطابقة بنفسها — خطأ اصطناعي، أو قطع اتصال، أو نجاح محاكى يبدو تمامًا كردّ من المصدر. لا يُتصل بالخادم الأصلي أبدًا.

تُطبَّق القواعد في موضعين، فيُغطَّى كل وضع اتصال: خادم الوكيل للمتصفحات وAndroid عبر الوكيل وiOS في وضع PAC، ونفق VPN على الجهاز لـ iOS في وضع VPN. تنطبق القواعد العامة على كل جهاز؛ وتُضاف قواعد الجهاز فوقها. تنتشر التغييرات عبر Realtime، فتصبح القاعدة التي تحفظها فعّالة على الهاتف دون إعادة اتصال.

قبل أن تبدأ

ما الذي تحتاجه

هاتف يلتقط بالفعل، ونقطة النهاية التي تريد تزييفها.

  • هاتف مقترن والالتقاط مشغّل — اتبع دليل iPhone أو Android أولًا.

  • مضيف API في قائمة SSL proxy لذلك الجهاز. القاعدة التي تطابق مسارًا لا ترى المسار إلا في مضيف مفكوك التشفير.

  • طريقة ومضيف ومسار الاستدعاء الذي تريد الإجابة عنه، والمحتوى الذي يتوقعه تطبيقك.

  • لنسخة السكربت فقط: صلاحية السكربتات من مستوى المسؤول في دورك. قواعد Mock العادية لا تحتاج إلى دور خاص.

خطوة بخطوة

نفّذها بالترتيب

الخطوات من الأولى إلى الرابعة تمنحك محاكاة ثابتة. والخامسة والسادسة تغطيان الحالتين اللتين لا يستطيعهما المحتوى الثابت: التنفيذ مرة واحدة، وحساب الإجابة.

  1. 01

    تأكد من فك تشفير المضيف

    افتح خلاصة لوحة التحكم وابحث عن طلب حقيقي إلى نقطة النهاية. إن أظهر صفه محتوى مفكوك التشفير فأنت جاهز. إن كان المضيف لا يزال يظهر مشفرًا، أضفه إلى قائمة SSL proxy للجهاز — من إجراءات المضيف في الصف، أو من إعدادات الجهاز — وأطلق الاستدعاء من جديد. في مضيف يمر مشفرًا لا يستطيع المنفّذ مطابقة سوى اسم المضيف؛ المسار غير مرئي، فلا تعمل محاكاة دقيقة بالمسار أبدًا.

  2. 02

    افتح Blocks وأضف قاعدة

    افتح صفحة Blocks من قائمة الإعدادات لقاعدة عامة، أو انتقل إلى الجهاز ثم Blocks لقاعدة تنطبق على هذا الهاتف وحده. أضف قاعدة واملأ الطريقة — أو اتركها فارغة لتطابق أي طريقة — والنمط. الأنماط هي البدائل نفسها من نوع مضيف-ومسار التي تستخدمها نقاط التوقف: المضيف، ثم شرطة مائلة، ثم المسار، مع نجمة حيثما يتغير جزء.

  3. 03

    اختر Mock وشكّل الاستجابة

    اضبط الإجراء على Mock. فبينما يهدف Block إلى إفشال الاستدعاء ويجعل Drop الأمر يبدو كأن الشبكة اختفت، يهدف Mock إلى تلبيته: اضبط الحالة — الافتراضي 200 — وأي ترويسات سينظر إليها التطبيق، والمحتوى. أعطه Content-Type الذي يحلّله تطبيقك؛ فعميل JSON الذي يتلقى ردًا نصيًا سيفشل قبل أن يقرأ بايتًا واحدًا. تبدو القاعدة عند حفظها بصيغة JSON هكذا.

    قاعدة Mock تجيب عن استدعاء أعلام الميزات بمحتوى ثابت
    json
    {
      "enabled": true,
      "method": "GET",
      "pattern": "api.example.com/v1/feature-flags",
      "action": {
        "type": "mock",
        "status": 200,
        "headers": { "Content-Type": "application/json" },
        "body": "{\"flags\": {\"newCheckout\": true}}"
      }
    }
  4. 04

    احفظ، وأطلق الاستدعاء، وتحقق من الخلاصة

    احفظ القاعدة واستخدم التطبيق. يُجاب عن الطلب المطابق التالي دون أن يغادر مسار الالتقاط أبدًا، ويظل يظهر في خلاصتك — معلَّمًا كمحاكى، لترى بالضبط ما زُيّف وتتأكد أن القاعدة فعلت ما توقعته. لا يرى التطبيق سوى رد خادم عادي: الاستجابات الاصطناعية لا تحمل أي ترويسة داخلية أو تعريفية، فلا شيء في الاستجابة يكشف الاعتراض.

    أطفئ القاعدة بمفتاح التفعيل عند الانتهاء. القاعدة المعطّلة لا تكلّف شيئًا وتحتفظ بشكلها للمرة القادمة.

  5. 05

    شغّلها مرة واحدة بالضبط بحدّ تنفيذ

    بعض المحاكاة يجب أن تحدث مرة واحدة. الحالة الكلاسيكية هي 401 اصطناعي يجعل التطبيق يظن أن رمزه انتهت صلاحيته فيشغّل تدفق التجديد — أجب عن كل طلب بهذه الطريقة فيجدّد التطبيق، ويعيد المحاولة، ويحصل على 401 آخر، ويدور إلى الأبد. يحدّ حقل Max runs عدد مرات عمل القاعدة؛ وعند الحد تعطّل نفسها ويعرض المحرر شارة تعطيل تلقائي، مختلفة عن قاعدة أطفأتها بنفسك.

    يُتتبَّع العدّاد لكل جهاز ويبقى بعد إعادة الاتصال وإعادة تشغيل التطبيق، فحدّ الواحد يعمل مرة واحدة فقط على ذلك الهاتف، لا مرة لكل جلسة. القاعدة العامة ذات الحد تُكبح فقط على الجهاز الذي استنفده وتستمر في العمل على كل هاتف آخر في الأسطول. يمكنك أيضًا أن تطلب من BusyBro بلغة عادية محاكاة 401 لمرة واحدة على مضيف، فيكتب القاعدة نفسها.

    الـ 401 ذو التنفيذ الواحد — مطابق للمحاكاة العادية مع حدّ بقيمة واحد
    json
    {
      "enabled": true,
      "method": "GET",
      "pattern": "api.example.com/v1/me",
      "action": {
        "type": "mock",
        "status": 401,
        "headers": { "Content-Type": "application/json" },
        "body": "{\"error\": \"token_expired\"}"
      },
      "maxRuns": 1
    }
  6. 06

    احسب المحتوى بسكربت

    محتوى Mock سلسلة نصية مجمّدة. عندما يجب أن تعتمد الإجابة على الطلب — معرّف يُعاد، أو طابع زمني، أو حقل يُرقَّع في الرد الحقيقي — بدّل إجراء القاعدة إلى Script، أو أنشئ سكربتًا مستقلًا في Settings ثم Scripts. تحصل على محرر شيفرة بإكمال تلقائي لكائنات الطلب والاستجابة والمساعدة، ولوحة Test تشغّل سكربتك على مدخل ملتقط حقيقي وتعرض فرقًا قبل وبعد دون لمس حركة البيانات الحية. يستخدم التشغيل التجريبي بيئة العزل نفسها التي يستخدمها الوكيل الحي، فاجتياز الاختبار يعني أنه يعمل فعليًا.

    السكربت الذي يرمي خطأ أو ينتهي وقته يفشل بشكل مفتوح: تُمرَّر البايتات الأصلية ويُعلَّم المدخل في الفاحص، فلا يستطيع سكربت معطوب أن يعطّل اتصالًا أو يكشف نفسه للتطبيق أبدًا. السكربتات من مستوى المسؤول لأنها تشغّل شيفرة عشوائية في مسار الالتقاط.

    خطاف طلب يختصر الدارة بمحتوى JSON محسوب
    javascript
    function onRequest(req) {
      if (req.path.startsWith("/v1/feature-flags")) {
        // computed per request — the upstream is never contacted
        return Response.json({ flags: { newCheckout: true, seed: Date.now() } }, { status: 200 });
      }
      // no return → forward unchanged
    }

استكشاف الأخطاء

ما الذي قد يسير بشكل خاطئ

القاعدة التي تبدو ميتة تحاول غالبًا مطابقة شيء لا تستطيع رؤيته.

  • القاعدة لا تعمل أبدًا

    تحقق من فك تشفير المضيف لذلك الجهاز — نمط المسار يحتاج ذلك — ثم تحقق من إملاء النمط ومن أن الطريقة مطابقة أو فارغة. يعرض صف الخلاصة للطلب الحقيقي المضيف والمسار بالضبط لنسخهما.

  • علق التطبيق في حلقة تجديد

    الـ 401 الاصطناعي لديك يعمل مع كل طلب. اضبط Max runs على واحد لتعطّل القاعدة نفسها بعد أول إصابة ويصل الطلب المعاد إلى الخادم الحقيقي.

  • يرفض التطبيق الرد المحاكى

    عادةً تكون ترويسة Content-Type مفقودة أو شكل المحتوى لا يطابق ما يحلّله العميل. انسخ ترويسات ومحتوى استجابة حقيقية ملتقطة من الفاحص كنقطة انطلاق.

  • تعرض القاعدة شارة تعطيل تلقائي

    استنفدت حدّ التنفيذ على هذا الجهاز. امسح Max runs أو أعد تفعيل القاعدة لتسليحها مجددًا.

  • عمل السكربت لكن الرد كان الحقيقي

    رمى السكربت خطأً أو انتهى وقته ففشل بشكل مفتوح. افتح المدخل في الفاحص — تحمل شارة الخطأ الرسالة ورقم السطر — وأصلحه في المحرر، وأعد تشغيل لوحة Test على المدخل نفسه قبل تفعيله من جديد.

الأسئلة الشائعة

أسئلة يطرحها الناس

هل يستطيع التطبيق معرفة أن الرد محاكى؟

ليس بفحص الاستجابة. الـ 200 المحاكى أو الـ 403 المحظور لا يحمل ترويسة تعريفية ويبدو كرد عادي من المصدر. الرؤية أحادية الاتجاه: يظهر المدخل المعلَّم في خلاصتك فقط.

هل يعمل هذا على iOS في وضع VPN أم عبر الوكيل فقط؟

كلاهما. يعمل محرك القواعد نفسه داخل نفق VPN في iOS وعلى خادم الوكيل، فيلتزم بالقاعدة iOS بوضعيه، وAndroid عبر الوكيل، والمتصفحات جميعًا.

هل أحتاج إلى إعادة نشر أي شيء عند تغيير قاعدة؟

لا. تعيش القواعد في الإعدادات نفسها التي تتدفق إلى الأجهزة عبر Realtime، فيُطبَّق الحفظ فورًا على الاتصالات الجديدة. اتصال keep-alive المفتوح مسبقًا يحتفظ بالتهيئة التي بدأ بها حتى يعيد الاتصال.

زيّف الرد، وأبقِ الهاتف حقيقيًا

قاعدة واحدة في لوحة التحكم، فيحصل التطبيق الذي في يدك على الاستجابة التي تريد اختبارها — بلا خادم محاكاة ولا إعادة بناء.

Ask your mate