
Connexion à une API REST locale via l’émulateur Android
Accédez facilement à votre API REST locale depuis un émulateur Android grâce à ce guide pratique.
Vous avez un serveur de développement local qui expose une API REST, et vous souhaitez y accéder depuis un émulateur Android ? Malheureusement, votre application Android ne parvient pas à consommer cette API, même si elle fonctionne parfaitement depuis votre navigateur ou Postman.
Dans cet article, je vais vous présenter les problèmes récurrents et les solutions pour y remédier.
L’émulateur Android se connecte à localhost
Vous obtenez une erreur de connexion (Connection refused)
Le problème le plus courant est liée à une confusion sur le fonctionnement de l’émulateur Android. En effet, un émulateur Android est en réalité une machine virtuelle qui tourne sur votre ordinateur. Par conséquent, lorsque vous essayez d’accéder à localhost
ou 127.0.0.1
, vous demandez à l’émulateur de se connecter à lui-même, et non à votre machine hôte sur laquelle le serveur API REST est en cours d’exécution.
Cela se traduit par une erreur de connexion (Connection refused) car aucun serveur n’écoute sur le port spécifié de l’émulateur Android.
Il vous faut donc déterminer l’adresse IP de votre machine hôte sur le même réseau que l’émulateur, puis utiliser cette adresse IP dans votre application Android plutôt que localhost
ou 127.0.0.1
pour accéder à la bonne machine.
Trouver l’adresse IP de votre machine hôte
Si l’adresse 10.0.2.2
ne fonctionne pas, vous pouvez tenter d’utiliser l’adresse IP de la machine hôte sur votre réseau local. Pour cela, vous pouvez utiliser la commande suivante dans un terminal :
ipconfig
sur Windowsifconfig
sur macOS ou Linux
Vous devrez trouver la ligne qui correspond à l’interface réseau que vous utilisez (Ethernet ou Wi-Fi), et identifier l’adresse IP. Généralement, sur un réseau personnel local, l’adresse IP ressemblera à 192.168.x.x
. En entreprise, vous pourriez voir des adresses comme 10.x.x.x
ou 172.16.x.x
.
Serveur API REST exposé sur la boucle locale
Erreur de connexion à l’API REST de votre machine hôte
Vous avez correctement configuré l’adresse IP de votre machine hôte dans votre application Android, mais vous rencontrez toujours des problèmes de connexion à l’API REST. La raison la plus courante est que votre serveur API REST est exposé sur la boucle locale (127.0.0.1
).
Pour exposer un serveur depuis une machine, le processus serveur utilise la fonction système bind
. Pour des raisons de sécurité, les frameworks Web exposent généralement votre API REST sur l’adresse IP 127.0.0.1
. Cela a pour effet d’exposer le serveur sur l’interface de boucle locale, ce qui signifie qu’il n’est accessible que depuis la machine elle-même.
Vous observez donc des réponses correctes via votre navigateur, curl, Insomnia ou Postman, mais votre application Android rencontre systématiquement des erreurs de connexion.
Résoudre le problème d’exposition de l’API REST
Pour résoudre ce problème, vous devez modifier la configuration de votre serveur de développement pour qu’il écoute sur toutes les interfaces réseau. Pour cela, vous devez spécifier l’adresse IP de bind 0.0.0.0
.
Par exemple, si vous utilisez le framework Flask en Python, vous pouvez démarrer votre serveur avec l’option --host=0.0.0.0
.
Tentatives de connexion en time out
Si vous rencontrez des erreurs réseau du type « Connection timed out » lors de la connexion à votre API REST depuis l’émulateur Android, il est probable qu’une restriction réseau bloque l’accès à votre serveur local.
Le cas le plus fréquent est la présence d’un firewall (pare-feu) sur votre machine hôte. Un firewall mal configuré peut empêcher l’émulateur Android d’accéder à l’API REST, même si celle-ci fonctionne en local via un client HTTP. Ce blocage se manifeste généralement par une erreur « Connection timed out », indiquant que la connexion n’a pas pu être établie.
Pour résoudre ce problème de connexion API REST, vous pouvez suivre ces étapes :
- Vérifiez les règles de votre firewall sur la machine hôte. Sur Windows, consultez les paramètres du « Pare-feu Windows ». Sous Linux, utilisez la commande
iptables -L
oufirewall-cmd --list-all
si vous utilisez Firewalld. - Ajoutez une règle d’autorisation si nécessaire pour permettre les connexions entrantes sur le port de votre serveur local.
L’accès à l’API REST débouche sur une erreur d’hôte injoignable
L’origine d’une erreur d’hôte injoignable
Une autre erreur courante est « Host unreachable » ou « No route to host ». Cela signifie que l’émulateur Android ne parvient pas à atteindre l’adresse IP de votre machine hôte. En général, cela est dû à un problème de configuration réseau de l’émulateur Android.
Ce type d’erreur peut survenir lorsque la machine destinataire est absente du réseau de la machine émettrice. Par exemple, cela survient si la machine destinataire est éteinte ou si elle est déconnectée du réseau. Dans le cas d’un émulateur, il est possible que la configuration de la carte réseau ne permette pas à la machine virtuelle de communiquer avec la machine hôte.
Configuration de la carte réseau d’un émulateur
Il existe en effet plusieurs configurations de la carte réseau :
- NAT : L’émulateur utilise une adresse IP interne et accède à Internet via la machine hôte. Dans ce mode, l’accès direct à l’API REST de la machine hôte est impossible.
- Internal : L’émulateur est isolé sur un réseau virtuel interne. L’émulateur ne peut ni accéder à Internet ni à la machine hôte.
- Host-only : L’émulateur peut communiquer avec la machine hôte, mais pas avec Internet.
- Bridge : L’émulateur est branché sur le réseau local de la machine hôte. L’émulateur est considéré comme un appareil distinct capable de communiquer avec tous les appareils connectés au même réseau local. Ce mode permet donc à l’émulateur d’accéder à Internet et à la machine hôte.
Par défaut, l’émulateur Android est configuré en mode NAT avec une configuration spécifique qui facilite le développement. Cela lui permet notamment d’accéder à Internet, et à la machine hôte via l’adresse IP 10.0.2.2
(adresse spéciale redirigeant vers la machine hôte).
Résoudre une erreur d’hôte injoignable
Pour résoudre le problème d’accès à l’API REST, vous pouvez essayer les solutions suivantes :
- Utiliser l’adresse IP
10.0.2.2
- Tenter de configurer l’émulateur en mode Bridge pour permettre une communication directe avec la machine hôte via son adresse IP réelle.
Autres problèmes possibles
Si vous avez suivi les étapes précédentes et que vous rencontrez toujours des problèmes de connexion à votre API REST depuis l’émulateur Android, voici deux pistes supplémentaires à explorer :
- Vérifiez que votre émulateur Android est autorisé à accéder au réseau. Parfois, les paramètres de sécurité de votre réseau local ou de votre entreprise peuvent restreindre l’accès aux réseaux par filtrage d’adresses MAC par exemple.
- Assurez-vous que votre réseau local n’a pas de règles pare-feu ou de restrictions qui bloquent les connexions entrantes vers votre machine hôte.
Il existe probablement d’autres pistes à explorer, mais je n’y ai pas encore été confronté. Si vous avez des suggestions, n’hésitez pas à les partager dans les commentaires.
Conclusion
En résumé, en suivant ces étapes, l’accès à une API REST locale depuis un émulateur Android est à la portée de tous :
- Comprendre la configuration réseau de l’émulateur et utiliser l’adresse
10.0.2.2
. - Configurer le serveur pour écouter sur
0.0.0.0
. - Adapter les règles du firewall et vérifier les restrictions réseau.
- Tester les différents modes réseau de l’émulateur (NAT, Bridge, etc.).
- Pour trouver d’autres solutions, consultez la documentation officielle de l’émulateur Android
Vous avez d’autres astuces ou des questions ? Partagez-les en commentaire.