Accès à localhost: port depuis l'émulateur Android


224

J'exécute un service Web sur ma machine locale qui s'exécute sur localhost:54722.

Je souhaite appeler le service à partir d'une application exécutée dans l'émulateur Android.

J'ai lu que l'utilisation 10.0.2.2de l'application accéderait à localhost, mais cela ne semble pas fonctionner avec le numéro de port également. Ça dit HttpResponseException: Bad Request.



1
Je m'attendais au comportement, que tous les ports ne sont pas transmis ... 5555 n'a pas été transmis mais 8080 et 8081 ont très bien fonctionné ...
Florian Loch

Vous devez modifier votre fichier de configuration vs-iis: stackoverflow.com/a/50991257/7149454
Nick Kovalsky

Réponses:


408

Vous pouvez accéder à votre machine hôte avec l'adresse IP " 10.0.2.2".

Cela a été conçu de cette manière par l'équipe Android. Ainsi, votre serveur Web peut parfaitement fonctionner sur localhost et à partir de votre application Android, vous pouvez y accéder via " http://10.0.2.2:<hostport>".

Si votre émulateur doit accéder à Internet via un serveur proxy, vous pouvez configurer un proxy HTTP personnalisé à partir de l'écran des contrôles étendus de l'émulateur. Avec l'émulateur ouvert, cliquez sur Plus points , puis sur Paramètres et proxy . À partir de là, vous pouvez définir vos propres paramètres de proxy HTTP. capture d'écran pour la configuration HTTP


9
Pourquoi cela? L'erreur Bad Request signifie que le serveur localhost est accessible, mais que la demande n'est pas tout à fait correcte.
Dédié

je ne suis pas sûr, je donne suite, que dites-vous exactement, est-ce pertinent pour la solution fournie ??
Akhil Jain

Ne fonctionne pas pour moi en ce moment, mais voici le lien vers les documents Android et il est clair que c'est ce qui devrait le faire (10.0.2.2); developer.android.com/tools/devices/emulator.html
Stuart Hallows

23
Évidemment, cela ne clarifie rien, Robin utilise déjà 10.0.2.2 ip dans la question et cela ne fonctionne pas. Bien que votre réponse soit correcte, elle ne fournit PAS de solution.
iversoncru

Moi aussi, j'obtiens 400: erreur de demande incorrecte avec la même solution.
Keval Patel

55

Utilisez 10.0.2.2 pour AVD par défaut et 10.0.3.2 pour Genymotion


4
Pourquoi 10.0.3.2 pour Genymotion?
Jacob

1
@Jacob Parce que Genymotion est un émulateur différent et ils ont choisi d'utiliser une adresse IP différente de l'émulateur de Google (qui confine à rien au sérieux, quand vont - ils faire quelque chose au sujet de leur émulateur par défaut terrible.?)
computrius

Dans l'API 28+, vous devez également autoriser explicitement le trafic non https (texte clair) dans votre configuration réseau. Voir ma réponse ci-dessous stackoverflow.com/a/56769746/2290369
İsmail Yavuz

19

J'ai rencontré le même problème sur Visual Studio lors de l'exécution d'une application Web sur IIS Express. pour le corriger, vous devez aller dans les propriétés de votre projet, puis cliquez sur l'onglet Débogage et remplacez http: // localhost: [VOTRE PORT] par http://127.0.0.1:[YOUR PORT] et définissez l'url Android sur http: / /10.0.2.2:[VOTRE PORT]. ça a marché pour moi.


1
ceci en conjonction avec l'URL 10.0.0.2 l'a résolu pour moi. ce paramètre semblait l'emporter sur l'approche hosting.json expliquée ailleurs.
user761574

1
J'exécute le serveur Django localement sur macOS et généralement j'y accède via http://localhost:5000/à la fois dans le simulateur Postman et iOS. Cette solution fonctionne pour le simulateur Android et pas besoin de modifier mon serveur, ni aucun paramètre dans le simulateur. Rapide, agréable et portable sur d'autres ordinateurs sans travail supplémentaire.
John Pang

Application Android avec xamarin et API Web ASP.NET utilisant toutes deux VS. TRAVAILLÉ! Merci!!
sohaib javed le

15

Si vous utilisez IIS Express, vous devrez peut-être vous lier à tous les noms d'hôtes au lieu de simplement `localhost '. Vérifiez cette bonne réponse:

https://stackoverflow.com/a/15809698/383761

Dites à IIS Express de se lier à toutes les adresses IP et noms d'hôte. Dans votre fichier .config (généralement% userprofile% \ My Documents \ IISExpress \ config \ applicationhost.config ou $ (solutionDir) .vs \ config \ applicationhost.config pour Visual Studio 2015), recherchez l'élément de liaison de votre site et ajoutez

<binding protocol="http" bindingInformation="*:8080:*" />

Assurez-vous de l'ajouter en tant que deuxième liaison au lieu de modifier celle existante ou VS ajoutera simplement un nouveau site avec un (1) Aussi, vous devrez peut-être exécuter VS en tant qu'administrateur.


Non, vous n'avez pas toujours besoin d'utiliser un nom d'hôte vide, blog.lextudio.com/…
Lex Li

<binding protocol = "http" bindingInformation = "*: 15000: 127.0.0.1" /> c'était la façon dont IIS Express aimait où 15000 était mon port, puis pointant vers 10.0.2.2:15000 sur l'émulateur Android
dpineda

11

Je l'ai résolu avec l'installation de "Conveyor by Keyoti" dans Visual Studio Professional 2015. Conveyor génère une adresse REMOTE (votre IP) avec un port (45455) qui permet la requête externe. Exemple:

entrez la description de l'image ici

Conveyor vous permet de tester des applications Web à partir de tablettes et de téléphones externes sur votre réseau ou d'émulateurs Android (sans http://10.0.2.2:<hostport>)

Les étapes sont dans le lien suivant:

https://marketplace.visualstudio.com/items?itemName=vs-publisher-1448185.ConveyorbyKeyoti


Que faire si vous n'exécutez pas le serveur Web dans Visual Studio? Imo, ce n'est pas une réponse à la question.
jAC

J'essaie mais après quelques jours plus tard, l'URL donnée ne fonctionne pas et je ne trouve aucune solution.
Md Imran Choudhury

Après une longue lutte, la seule chose qui a fait l'affaire était d'installer cette extension et d'activer la fonction URL distante. Il faut un peu plus de temps à la requête pour accéder à l'API, mais cela fonctionne.
fabian278

9

J'ai un serveur Web en cours d'exécution sur mon hôte local.

Si j'ouvre l'émulateur et que je souhaite me connecter à mon hôte local que j'utilise 192.168.x.x. Cela signifie que vous devez utiliser votre adresse IP de réseau local. Soit dit en passant, votre HttpResponseException (Bad Request)ne signifie pas que l'hôte n'est pas accessible.

D'autres erreurs entraînent cette exception.


9

Étant donné qu'il 10.0.2.2ne s'agit pas d'un domaine sécurisé pour Android, vous devez autoriser les domaines non sécurisés dans votre configuration réseau pour l'API 28+ où les connexions non TLS sont empêchées par défaut.

Vous pouvez utiliser mes configurations suivantes:

Créez un nouveau fichier dans main / res / xml / network_security_config.xml comme:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">localhost</domain>
        <domain includeSubdomains="true">10.0.2.2</domain>
    </domain-config>
</network-security-config>

Et pointez-le dans AndroidManifest.xml

<application
......
......
android:networkSecurityConfig="@xml/network_security_config">

8

Le problème est que l'émulateur Android est mappé 10.0.2.2sur 127.0.0.1, pas sur localhost. Configurez donc votre serveur Web sur serveron 127.0.0.1:54722et non localhost:54722. Ça devrait le faire.


7

Après avoir exécuté votre hôte local, vous arrivez http://localhost:[port number]/ici, vous avez trouvé votre numéro de port.

Ensuite, obtenez votre adresse IP à partir de la commande, ouvrez votre commande Windows et tapez ipconfig entrez la description de l'image ici

Dans mon cas, IP était 192.168.10.33donc mon URL sera http://192.168.10.33:: numéro de port] /. Sous Android, le studio utilise cette URL comme URL. Et après cela, définissez votre URL et votre numéro de port dans un proxy manuel pour l'émulateur.

entrez la description de l'image ici


3

vous devez définir l'URL comme 10.0.2.2:portNr

portNr = le port donné par ASP.NET Development Server sur lequel mon service actuel s'exécute localhost:3229/Service.svc

donc mon URL est 10.0.2.2:3229

j'avais résolu mon problème de cette façon

j'espère que ça aide ...


3

"BadRequest" est une erreur qui est généralement envoyée par le serveur lui-même, voir rfc 2616

10.4.1 400 Mauvaise requête

La demande n'a pas pu être comprise par le serveur en raison d'une syntaxe incorrecte. Le client NE DEVRAIT PAS répéter la demande sans modifications.

Vous avez donc une connexion fonctionnelle avec le serveur, mais votre demande ne correspond pas au formulaire expecet. Je ne sais pas comment vous créez la connexion, quels en-têtes sont inclus (s'il y en a) - mais c'est ce que vous devriez vérifier.

Si vous avez besoin d'aide supplémentaire, expliquez en quoi consiste votre code et ce qu'il utilise pour se connecter au serveur, afin d'avoir une vue d'ensemble.

Voici une question avec le même problème - la réponse était que le type de contenu n'était pas défini dans l'en-tête.


Vous avez obtenu le bon point, mais vous avez ensuite pris la mauvaise direction. La prochaine étape devrait être d'analyser le serveur pour savoir de quel type de requêtes il se soucie, afin de comprendre pourquoi les requêtes des émulateurs sont répondues par 400. Une étude de cas pour IIS Express peut être trouvée ici, blog.lextudio.com/…
Lex Li

1

Je voudrais vous montrer comment j'accède aux API Web IISExpress à partir de mon émulateur Android. J'utilise Visual Studio 2015. Et j'appelle l'émulateur Android depuis Android Studio.

Tout ce que je dois faire est d'ajouter la ligne suivante à la configuration de liaison dans mon applicationhost.config fichier

<binding protocol="http" bindingInformation="*:<your-port>:" />

Ensuite, je vérifie et utilise l'adresse IP4 pour accéder à mon API à partir de l'émulateur Android

Condition: vous devez exécuter Visual Studio en tant qu'administrateur.Ce message donne un moyen parfait de le faire.

Pour plus de détails, veuillez visiter mon article sur github

J'espère que cela t'aides.


2
Ou installez l'extension VS gratuite appelée Conveyor depuis la fenêtre Extensions. Cela ouvre IIS Express aux demandes externes sans modifier la configuration.
Jim W dit réintégrer Monica le

Vous avez d'autres options, blog.lextudio.com/… que d'exécuter VS en tant qu'administrateur. Je n'appellerai donc pas cela un must .
Lex Li

1

Pour les utilisateurs de Laravel Homestead: Si quelqu'un utilise Laravel avec homestead, vous pouvez accéder au backend de l'application en utilisant 192.168.10.10 dans l'émulateur

Ne fonctionne toujours pas? Une autre bonne solution consiste à utiliser ngrok https://ngrok.com/


1

J'utilise Windows 10 comme plate-forme de développement, l'accès à 10.0.2.2:port dans mon émulateur ne fonctionne pas comme prévu, et le même résultat pour les autres solutions de cette question également.

Après plusieurs heures de fouille, j'ai trouvé que si vous ajoutez -writable-system argument à la commande de démarrage de l'émulateur, les choses fonctionneront simplement.

Vous devez démarrer un émulateur via la ligne de commande comme ci-dessous:

 emulator.exe -avd <emulator_name> -writable-system

Ensuite, dans votre émulateur, vous pouvez accéder à votre service API exécuté sur la machine hôte, en utilisant l'adresse IP LAN et le port de liaison:

http://192.168.1.2:<port>

J'espère que cela vous aidera.

À propos du démarrage de l'émulateur à partir de la ligne de commande: https://developer.android.com/studio/run/emulator-commandline .


1

Pour accéder à localhost sur l'émulateur Android

  • Ajoutez l'autorisation Internet à partir d'AndroidManifest.xml
    <uses-permission android:name="android.permission.INTERNET" />

  • Ajoutez android:usesCleartextTraffic="true", plus de détails ici :

  • Exécutez la commande mentionnée ci-dessous pour trouver votre adresse IP système:

ifconfig | grep "inet " | grep -v 127.0.0.1

Copiez l'adresse IP obtenue à partir de cette étape (A)

  • Exécutez votre application dorsale, à laquelle vous pouvez accéder depuis localhostou 127.0.0.1depuis votre système.

  • Maintenant, dans Android Studio, vous pouvez remplacer l'URL si vous utilisez du code ou vous pouvez utiliser l'adresse IP obtenue à l'étape (A) et essayer d'ouvrir dans le navigateur Web, comme ceci http://192.168.0.102:8080/

N'oubliez pas d'ajouter PORT après l'adresse IP, dans mon cas, l'application fonctionnait sur le port 8080, j'ai donc ajouté l'IP obtenue en (A) avec le port 8080


0

localhost semblait bien fonctionner dans mon émulateur au début, puis j'ai commencé à obtenir une exception de connexion refusée J'ai utilisé 127.0.2.2 à partir du navigateur de l'émulateur et cela a fonctionné et quand j'ai utilisé cela dans mon application Android dans l'émulateur, il a recommencé à montrer le problème de connexion refusée .

alors j'ai fait ifconfig et j'ai utilisé l'ip 192.168.2.2 et cela a fonctionné parfaitement


0

Une mauvaise demande signifie généralement que le format des données que vous envoyez est incorrect. Peut être un mappage de données non concordant. Si vous obtenez une mauvaise demande, cela signifie que vous pouvez vous connecter au serveur, mais la demande n'est pas envoyée correctement.


0

Si quelqu'un cherche toujours cela, c'est comme ça que ça a fonctionné pour moi.

Vous devez trouver l'IP de votre machine par rapport au périphérique / émulateur auquel vous êtes connecté. Pour les émulateurs, vous devez suivre les étapes ci-dessous;

  1. Accédez à VM Virtual box -> sélectionnez le périphérique connecté dans la liste.
  2. Sélectionnez Paramètres -> Réseau -> Découvrez à quel réseau l'appareil est connecté. Pour moi, c'était «VirtualBox Host-Only Ethernet Adapter # 2».
  3. Dans virtualbox, allez dans Fichiers-> Préférences-> Réseau-> Réseaux réservés aux hôtes et découvrez l'IPv4 pour le réseau spécifié à l'étape ci-dessus. (En survolant, vous obtiendrez les informations)

Fournissez cette adresse IP pour accéder à l'hôte local à partir de l'émulateur. Le port est le même que celui que vous avez fourni lors de l'exécution / publication de vos services.

Remarque n ° 1: assurez-vous d'avoir pris soin des pare-feu et des règles entrantes.

Remarque n ° 2: veuillez vérifier cette adresse IP après avoir redémarré votre ordinateur. Pour une raison quelconque, même si j'ai fourni "Utiliser l'adresse IP suivante", l'adresse IP hôte uniquement a été modifiée.


0

J'ai résolu exactement le problème lorsque la couche de service utilise Visual Studio IIS Express. Il suffit de pointer vers 10.0.2.2:port ne fonctionnera pas. Au lieu de déconner avec IIS Express comme mentionné dans d'autres articles, je mets juste un proxy devant IIS Express. Par exemple, apache ou nginx. Le nginx.conf ressemblera à

 # Mobile API
 server { 
    listen       8090;
    server_name  default_server;

    location / {
        proxy_pass http://localhost:54722;
    }
  }

Ensuite, l'android doit pointer vers mon adresse IP comme 192.168.xx: 8090


0

si vous utilisez un package tiers comme node express ou angular-cli, vous devrez trouver l'IP de votre machine et attacher votre hôte à cette IP dans la configuration de démarrage du serveur (au lieu de localhost). Ensuite, lancez-le à partir de l'émulateur en utilisant l'IP. Par exemple, j'ai dû utiliser: ng serve -H 10.149.212.104pour utiliser le angular-cli. Puis à partir de l'émulateur que j'ai utilisé:http://10.149.212.104:4200


0

1) Exécutez la commande ipconfig dans cmd

2) Vous obtiendrez un résultat comme celui-ci entrez la description de l'image ici

3) Ensuite, utilisez l'adresse IPv4 de l'adaptateur réseau VMWare 1 suivie du numéro de port

Dans mon cas, son 8080, donc au lieu d'utiliser localhost: 8080

J'utilise 192.168.56.1:8080

entrez la description de l'image ici

Terminé.....


0

Explication pourquoi localhostles émulateurs ne sont pas disponibles pour toute personne ayant un problème d'accès de base. Pour les cas sophistiqués, lisez les autres réponses.

Problème: l' émulateur possède son propre réseau local et se localhostmappe à l' émulateur , mais PAS à votre hôte!

Solution:

  1. Liez votre serveur à 0.0.0.0pour le rendre disponible pour le réseau de l'émulateur
  2. Obtenez l'adresse IP externe de votre ordinateur portable: ifconfigcommande pour Mac
  3. Dans Android (ou application Flutter), utilisez l'adresse IP de votre interface externe comme: 192.168.1.10au lieu delocalhost

0

J'ai eu le même problème lorsque j'essayais de me connecter à mon service Web IIS .NET à partir de l'émulateur Android.

  1. installer npm install -g iisexpress-proxy
  2. iisexpress-proxy 53990 to 9000 au proxy IIS express port vers 9000 et accéder au port 9000 à partir de l'émulateur comme "http://10.0.2.2:9000"

la raison semble être par défaut, IIS Express n'autorise pas les connexions depuis le réseau https://forums.asp.net/t/2125232.aspx?Bad+Request+Invalid+Hostname+when+accessing+localhost+Web+API + ou + Web + App + de + à travers + LAN

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.