Guide

Simuler une réponse d'API sur un appareil réel

Répondez à l'un des appels d'API de votre app par une réponse prédéfinie — sur le téléphone dans votre main, sans faux serveur ni recompilation. Une règle de blocage Mock pour un corps fixe, un plafond d'exécutions quand elle doit se déclencher exactement une fois, et un script quand le corps doit être calculé.

Le mock sur un appareil réel est là où la plupart des montages s'effondrent : le serveur factice vit sur un portable, le téléphone doit pouvoir l'atteindre, et l'app doit pointer dessus. Busymate DevTools place le mock dans le chemin de capture lui-même. Une règle de blocage surveille chaque requête correspondant à une méthode et à un motif hôte-plus-chemin, et répond elle-même à la correspondance — une erreur synthétique, une connexion coupée, ou un succès simulé qui ressemble exactement à une réponse de l'origine. Le serveur amont n'est jamais contacté.

Les règles sont appliquées à deux endroits, donc chaque mode de connexion est couvert : le serveur proxy pour les navigateurs, Android via le proxy et iOS en mode PAC, et le tunnel VPN sur l'appareil pour iOS en mode VPN. Les règles globales s'appliquent à tous les appareils ; les règles par appareil s'y ajoutent. Les changements se propagent en temps réel, si bien qu'une règle enregistrée est active sur le téléphone sans reconnexion.

Avant de commencer

Ce qu'il vous faut

Un téléphone qui capture déjà, et l'endpoint que vous voulez simuler.

  • Un téléphone appairé avec la capture activée — suivez d'abord le guide iPhone ou Android.

  • L'hôte de l'API dans la liste SSL proxy de cet appareil. Une règle qui filtre sur un chemin ne voit ce chemin que sur un hôte déchiffré.

  • La méthode, l'hôte et le chemin de l'appel auquel vous voulez répondre, et le corps que votre app attend en retour.

  • Pour la variante script uniquement : la capacité scripts de niveau administrateur sur votre rôle. Les règles Mock simples n'exigent aucun rôle particulier.

Pas à pas

Faites-le dans l'ordre

Les étapes une à quatre vous donnent un mock fixe. Les cinq et six couvrent les deux cas qu'un corps fixe ne peut pas traiter : ne se déclencher qu'une fois, et calculer la réponse.

  1. 01

    Assurez-vous que l'hôte est déchiffré

    Ouvrez le flux du dashboard et trouvez une requête réelle vers l'endpoint. Si sa ligne montre un corps déchiffré, vous êtes prêt. Si l'hôte apparaît encore chiffré, ajoutez-le à la liste SSL proxy de l'appareil — depuis les actions d'hôte de la ligne, ou dans les réglages de l'appareil — et déclenchez l'appel à nouveau. Sur un hôte qui passe chiffré, le moteur ne peut filtrer que sur le nom d'hôte ; le chemin est invisible, donc un mock précis au chemin ne se déclenche jamais.

  2. 02

    Ouvrez Blocks et ajoutez une règle

    Ouvrez la page Blocks depuis la navigation des réglages pour une règle globale, ou allez sur l'appareil puis Blocks pour une règle qui ne s'applique qu'à ce téléphone. Ajoutez une règle et renseignez la méthode — ou laissez-la vide pour tout accepter — et le motif. Les motifs sont les mêmes jokers hôte-plus-chemin que ceux des points d'arrêt : l'hôte, une barre oblique, le chemin, avec un astérisque là où un segment varie.

  3. 03

    Choisissez Mock et façonnez la réponse

    Réglez l'action sur Mock. Là où Block sert à faire échouer un appel et Drop à faire croire que le réseau a disparu, Mock sert à le satisfaire : définissez le statut — 200 par défaut —, les en-têtes que l'app va regarder, et le corps. Donnez-lui le Content-Type que votre app analyse ; un client JSON qui reçoit une réponse texte échouera avant d'en lire un octet. Enregistrée en JSON, la règle ressemble à ceci.

    Une règle Mock qui répond à un appel de feature flags par un corps fixe
    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

    Enregistrez, déclenchez l'appel et vérifiez le flux

    Enregistrez la règle et utilisez l'app. La prochaine requête correspondante reçoit sa réponse sans jamais quitter le chemin de capture, et elle apparaît toujours dans votre flux — marquée comme simulée, pour que vous voyiez exactement ce qui a été falsifié et confirmiez que la règle a fait ce que vous attendiez. L'app ne voit qu'une réponse serveur ordinaire : les réponses synthétiques ne portent aucun en-tête interne ou identifiant, donc rien dans la réponse ne révèle l'interception.

    Désactivez la règle avec son interrupteur quand vous avez terminé. Une règle désactivée ne coûte rien et garde sa forme pour la prochaine fois.

  5. 05

    Déclenchez-la exactement une fois avec un plafond d'exécutions

    Certains mocks doivent n'arriver qu'une fois. Le cas classique est un 401 synthétique qui fait croire à l'app que son jeton a expiré pour qu'elle lance son flux de rafraîchissement — répondez ainsi à chaque requête et l'app rafraîchit, réessaie, reçoit un autre 401 et tourne à l'infini. Le champ Max runs plafonne le nombre de déclenchements d'une règle ; au plafond elle se désactive d'elle-même et l'éditeur affiche un badge auto-désactivée, distinct d'une règle que vous auriez coupée vous-même.

    Le compteur est tenu par appareil et survit aux reconnexions et aux relances de l'app, donc un plafond de un ne se déclenche qu'une seule fois sur ce téléphone, pas une fois par session. Une règle globale plafonnée n'est supprimée que sur l'appareil qui l'a épuisée et continue de se déclencher sur tous les autres téléphones de la flotte. Vous pouvez aussi demander à BusyBro, en langage naturel, un mock 401 à usage unique sur un hôte : il écrit la même règle.

    Le 401 à usage unique — identique à un mock normal, plus un plafond de un
    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

    Calculez le corps avec un script

    Un corps Mock est une chaîne figée. Quand la réponse doit dépendre de la requête — un identifiant renvoyé, un horodatage, un champ patché dans la vraie réponse — passez l'action de la règle sur Script, ou créez un script autonome sous Settings puis Scripts. Vous disposez d'un éditeur de code avec autocomplétion pour les objets de requête, de réponse et d'aide, et d'un panneau Test qui exécute votre script sur une entrée capturée réelle et affiche un diff avant-après sans toucher au trafic en direct. L'essai à blanc utilise le sandbox identique à celui du proxy en production, donc réussir le test signifie que ça marche en réel.

    Un script qui lève une exception ou dépasse le délai échoue en mode ouvert : les octets d'origine sont transmis et l'entrée est marquée dans l'inspecteur, si bien qu'un script cassé ne peut jamais bloquer une connexion ni se trahir auprès de l'app. Les scripts sont de niveau administrateur parce qu'ils exécutent du code arbitraire dans le chemin de capture.

    Un hook de requête qui court-circuite avec un corps JSON calculé
    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
    }

Dépannage

Ce qui peut mal tourner

Une règle qui semble morte tente presque toujours de filtrer sur quelque chose qu'elle ne peut pas voir.

  • La règle ne se déclenche jamais

    Vérifiez que l'hôte est déchiffré pour cet appareil — un motif de chemin en a besoin —, puis l'orthographe du motif et que la méthode correspond ou est vide. La ligne du flux de la vraie requête montre l'hôte et le chemin exacts à copier.

  • L'app est coincée dans une boucle de rafraîchissement

    Votre 401 synthétique se déclenche à chaque requête. Réglez Max runs sur un pour que la règle se désactive après le premier déclenchement et que la requête rejouée atteigne le vrai serveur.

  • L'app rejette la réponse simulée

    En général l'en-tête Content-Type manque ou la forme du corps ne correspond pas à ce que le client analyse. Copiez les en-têtes et le corps d'une vraie réponse capturée depuis l'inspecteur comme point de départ.

  • La règle affiche un badge auto-désactivée

    Elle a épuisé son plafond d'exécutions sur cet appareil. Effacez Max runs ou réactivez la règle pour la réarmer.

  • Le script a tourné mais la réponse était la vraie

    Le script a levé une exception ou dépassé le délai et a échoué en mode ouvert. Ouvrez l'entrée dans l'inspecteur — le badge d'erreur porte le message et la ligne —, corrigez dans l'éditeur, et relancez le panneau Test sur la même entrée avant de le réactiver.

FAQ

Les questions qu'on nous pose

L'app peut-elle savoir qu'elle a été simulée ?

Pas en inspectant la réponse. Un 200 simulé ou un 403 bloqué ne porte aucun en-tête identifiant et ressemble à une réponse ordinaire de l'origine. La visibilité est à sens unique : l'entrée marquée n'apparaît que dans votre flux.

Cela fonctionne-t-il sur iOS en mode VPN, ou seulement via le proxy ?

Les deux. Le même moteur de règles tourne dans le tunnel VPN iOS et sur le serveur proxy, donc iOS dans l'un ou l'autre mode, Android via le proxy et les navigateurs respectent tous la règle.

Dois-je redéployer quelque chose quand je modifie une règle ?

Non. Les règles vivent dans les mêmes réglages qui circulent vers les appareils en temps réel, donc un enregistrement s'applique immédiatement aux nouvelles connexions. Une connexion keep-alive déjà ouverte garde la configuration avec laquelle elle a démarré jusqu'à sa reconnexion.

Falsifiez la réponse, gardez le téléphone réel

Une règle dans le dashboard, et l'app dans votre main reçoit la réponse que vous voulez tester — sans serveur factice, sans recompilation.

Ask your mate