Ghid

Simulează un răspuns API pe un dispozitiv real

Răspunde la unul dintre apelurile API ale aplicației tale cu un răspuns predefinit — pe telefonul din mâna ta, fără server fals și fără recompilare. O regulă de blocare Mock pentru un corp fix, o limită de rulări când trebuie să se declanșeze exact o dată și un script când corpul trebuie calculat.

Simularea pe un dispozitiv real este locul unde se prăbușesc majoritatea configurărilor: serverul stub stă pe un laptop, telefonul trebuie să ajungă la el, iar aplicația trebuie îndreptată către el. Busymate DevTools pune în schimb simularea chiar în calea de captură. O regulă de blocare urmărește fiecare cerere care se potrivește cu o metodă și un tipar host-plus-cale și răspunde singură potrivirii — o eroare sintetică, o conexiune întreruptă sau un succes simulat care arată exact ca un răspuns de la origine. Serverul upstream nu este contactat niciodată.

Regulile sunt aplicate în două locuri, așa că fiecare mod de conexiune este acoperit: serverul proxy pentru browsere, Android prin proxy și iOS în mod PAC, și tunelul VPN de pe dispozitiv pentru iOS în mod VPN. Regulile globale se aplică fiecărui dispozitiv; regulile per dispozitiv se adaugă peste. Modificările se propagă prin Realtime, așa că o regulă salvată este activă pe telefon fără reconectare.

Înainte de a începe

De ce ai nevoie

Un telefon care capturează deja și endpoint-ul pe care vrei să-l falsifici.

  • Un telefon asociat cu captura pornită — urmează mai întâi ghidul pentru iPhone sau Android.

  • Hostul API în lista SSL proxy a acelui dispozitiv. O regulă care se potrivește pe o cale poate vedea calea doar pe un host decriptat.

  • Metoda, hostul și calea apelului la care vrei să răspunzi, și corpul pe care aplicația ta îl așteaptă înapoi.

  • Doar pentru varianta cu script: capacitatea scripts de nivel administrator pe rolul tău. Regulile Mock simple nu au nevoie de niciun rol special.

Pas cu pas

Urmează ordinea

Pașii unu până la patru îți dau o simulare fixă. Cinci și șase acoperă cele două cazuri pe care un corp fix nu le poate rezolva: declanșarea o singură dată și calcularea răspunsului.

  1. 01

    Asigură-te că hostul este decriptat

    Deschide feedul dashboardului și găsește o cerere reală către endpoint. Dacă rândul ei arată un corp decriptat, ești gata. Dacă hostul apare încă criptat, adaugă-l în lista SSL proxy a dispozitivului — din acțiunile de host ale rândului sau din setările dispozitivului — și declanșează apelul din nou. Pe un host care trece criptat, motorul poate potrivi doar numele hostului; calea este invizibilă, așa că o simulare precisă pe cale nu se declanșează niciodată.

  2. 02

    Deschide Blocks și adaugă o regulă

    Deschide pagina Blocks din navigația de setări pentru o regulă globală, sau mergi la dispozitiv, apoi Blocks, pentru o regulă care se aplică doar acestui telefon. Adaugă o regulă și completează metoda — sau las-o goală ca să se potrivească cu oricare — și tiparul. Tiparele sunt aceleași wildcard-uri host-plus-cale pe care le folosesc breakpoint-urile: hostul, o bară, calea, cu un asterisc oriunde variază un segment.

  3. 03

    Alege Mock și modelează răspunsul

    Setează acțiunea pe Mock. Acolo unde Block este menit să facă un apel să eșueze, iar Drop îl face să pară că rețeaua a dispărut, Mock este menit să-l satisfacă: setează statusul — implicit 200 —, orice antete la care aplicația se va uita, și corpul. Dă-i Content-Type-ul pe care aplicația ta îl parsează; un client JSON care primește un răspuns text va eșua înainte să citească un octet. Salvată ca JSON, regula arată așa.

    O regulă Mock care răspunde la un apel de feature flags cu un corp fix
    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

    Salvează, declanșează apelul și verifică feedul

    Salvează regula și folosește aplicația. Următoarea cerere care se potrivește primește răspuns fără să părăsească vreodată calea de captură, și apare totuși în feedul tău — marcată ca simulată, ca să vezi exact ce a fost falsificat și să confirmi că regula a făcut ce te așteptai. Aplicația vede doar un răspuns obișnuit de server: răspunsurile sintetice nu poartă niciun antet intern sau de identificare, așa că nimic din răspuns nu dezvăluie interceptarea.

    Oprește regula din comutatorul ei când ai terminat. O regulă dezactivată nu costă nimic și își păstrează forma pentru data viitoare.

  5. 05

    Declanșeaz-o exact o dată cu o limită de rulări

    Unele simulări trebuie să se întâmple o singură dată. Cazul clasic este un 401 sintetic care face aplicația să creadă că tokenul a expirat, ca să-și ruleze fluxul de reîmprospătare — răspunde așa la fiecare cerere și aplicația reîmprospătează, reîncearcă, primește alt 401 și se învârte la nesfârșit. Câmpul Max runs plafonează de câte ori se poate declanșa o regulă; la plafon se dezactivează singură, iar editorul arată o insignă de autodezactivare, diferită de o regulă pe care ai oprit-o tu.

    Numărătoarea se ține per dispozitiv și supraviețuiește reconectărilor și repornirilor aplicației, așa că o limită de unu se declanșează o singură dată vreodată pe acel telefon, nu o dată pe sesiune. O regulă globală cu limită este suprimată doar pe dispozitivul care a consumat-o și continuă să se declanșeze pe fiecare alt telefon din flotă. Poți cere și lui BusyBro, în limbaj natural, o simulare 401 de o singură dată pe un host, și scrie aceeași regulă.

    401-ul cu o singură declanșare — identic cu o simulare normală plus o limită de unu
    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

    Calculează corpul cu un script

    Un corp Mock este un șir înghețat. Când răspunsul trebuie să depindă de cerere — un id returnat, un timestamp, un câmp modificat în răspunsul real — schimbă acțiunea regulii în Script, sau creează un script de sine stătător sub Settings, apoi Scripts. Primești un editor de cod cu autocompletare pentru obiectele de cerere, răspuns și ajutătoare, și un panou Test care rulează scriptul pe o intrare capturată reală și arată un diff înainte-după fără să atingă traficul live. Rularea de probă folosește sandbox-ul identic cu cel al proxy-ului live, așa că trecerea testului înseamnă că funcționează live.

    Un script care aruncă o eroare sau expiră eșuează deschis: octeții originali sunt transmiși mai departe și intrarea este marcată în inspector, așa că un script stricat nu poate bloca niciodată o conexiune sau să se dea de gol în fața aplicației. Scripturile sunt de nivel administrator pentru că rulează cod arbitrar în calea de captură.

    Un hook de cerere care scurtcircuitează cu un corp JSON calculat
    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
    }

Depanare

Ce poate merge prost

O regulă care pare moartă aproape întotdeauna încearcă să se potrivească cu ceva ce nu poate vedea.

  • Regula nu se declanșează niciodată

    Verifică dacă hostul este decriptat pentru acel dispozitiv — un tipar de cale are nevoie de asta —, apoi ortografia tiparului și dacă metoda se potrivește sau este goală. Rândul din feed al cererii reale arată hostul și calea exacte de copiat.

  • Aplicația s-a blocat într-o buclă de reîmprospătare

    401-ul tău sintetic se declanșează la fiecare cerere. Setează Max runs la unu ca regula să se dezactiveze după prima potrivire și cererea reîncercată să ajungă la serverul real.

  • Aplicația respinge răspunsul simulat

    De obicei lipsește antetul Content-Type sau forma corpului nu se potrivește cu ce parsează clientul. Copiază antetele și corpul unui răspuns real capturat din inspector ca punct de plecare.

  • Regula arată o insignă de autodezactivare

    Și-a consumat limita de rulări pe acest dispozitiv. Șterge Max runs sau reactivează regula ca s-o armezi din nou.

  • Scriptul a rulat, dar răspunsul a fost cel real

    Scriptul a aruncat o eroare sau a expirat și a eșuat deschis. Deschide intrarea în inspector — insigna de eroare poartă mesajul și linia —, repară-l în editor și rulează din nou panoul Test pe aceeași intrare înainte de a-l reactiva.

Întrebări frecvente

Întrebări frecvente

Poate aplicația să-și dea seama că a fost simulată?

Nu inspectând răspunsul. Un 200 simulat sau un 403 blocat nu poartă niciun antet de identificare și arată ca un răspuns obișnuit de la origine. Vizibilitatea este într-un singur sens: intrarea marcată apare doar în feedul tău.

Funcționează pe iOS în mod VPN sau doar prin proxy?

Ambele. Același motor de reguli rulează în tunelul VPN iOS și pe serverul proxy, așa că iOS în oricare mod, Android prin proxy și browserele respectă toate regula.

Trebuie să redistribui ceva când schimb o regulă?

Nu. Regulile trăiesc în aceleași setări care curg către dispozitive prin Realtime, așa că o salvare se aplică imediat conexiunilor noi. O conexiune keep-alive deja deschisă păstrează configurația cu care a pornit până se reconectează.

Falsifică răspunsul, păstrează telefonul real

O regulă în dashboard, iar aplicația din mâna ta primește răspunsul pe care vrei să-l testezi — fără server stub, fără recompilare.

Ask your mate