Zugriff auf localhost: Port vom Android-Emulator


224

Ich führe einen Webdienst auf meinem lokalen Computer aus, auf dem ausgeführt wird localhost:54722.

Ich möchte den Dienst von einer App aus aufrufen, die im Android-Emulator ausgeführt wird.

Ich habe gelesen, dass die Verwendung 10.0.2.2in der App auf localhost zugreifen würde, aber es scheint auch nicht mit der Portnummer zu funktionieren. Es heißt HttpResponseException: Bad Request.



1
Ich habe das Verhalten erwartet, dass nicht alle Ports weitergeleitet werden ... 5555 wurde nicht weitergeleitet, aber 8080 und 8081 funktionierten einwandfrei ...
Florian Loch

Sie müssen Ihre vs-iis-Konfigurationsdatei bearbeiten: stackoverflow.com/a/50991257/7149454
Nick Kovalsky

Antworten:


408

Sie können mit der IP-Adresse " 10.0.2.2" auf Ihren Host-Computer zugreifen .

Dies wurde vom Android-Team auf diese Weise entworfen. So kann Ihr Webserver perfekt auf localhost ausgeführt werden und über Ihre Android-App können Sie über " http://10.0.2.2:<hostport>" darauf zugreifen .

Wenn Ihr Emulator über einen Proxyserver auf das Internet zugreifen muss, können Sie einen benutzerdefinierten HTTP-Proxy über den Bildschirm Erweiterte Steuerelemente des Emulators konfigurieren. Klicken Sie bei geöffnetem Emulator auf Mehr Punkte und dann auf Einstellungen und Proxy . Von hier aus können Sie Ihre eigenen HTTP-Proxy-Einstellungen definieren. Screenshot für die HTTP-Konfiguration


9
Warum sollte es? Der Fehler Bad Request bedeutet, dass der Localhost-Server erreichbar ist, aber dass die Anfrage nicht ganz korrekt ist.
Dediqated

Ich bin nicht sicher, ich folge durch, was genau sagst du, ist es relevant für die bereitgestellte Lösung?
Akhil Jain

Ich arbeite momentan nicht für mich, aber hier ist der Link zu den Android-Dokumenten und es ist klar, dass dies genau das ist, was es tun sollte (10.0.2.2). developer.android.com/tools/devices/emulator.html
Stuart Hallows

23
Offensichtlich klärt dies nichts, Robin verwendet bereits 10.0.2.2 IP in der Frage und es funktioniert nicht. Obwohl Ihre Antwort richtig ist, bietet sie KEINE Lösung.
iversoncru

Ich bekomme auch 400: Fehlerhafter Anforderungsfehler mit derselben Lösung.
Keval Patel

55

Verwenden Sie 10.0.2.2 für Standard-AVD und 10.0.3.2 für Genymotion


4
Warum 10.0.3.2 für Genymotion?
Jacob

1
@Jacob Weil Genymotion ein anderer Emulator ist und sie sich dafür entschieden haben, eine andere IP als den Emulator von Google zu verwenden (Was grenzt an nutzlos. Ernsthaft, wann werden sie etwas gegen ihren schrecklichen Standardemulator
unternehmen

In API 28+ sollten Sie auch in Ihrer Netzwerkkonfiguration explizit Nicht-https-Verkehr (Klartext) zulassen. Siehe meine Antwort unten stackoverflow.com/a/56769746/2290369
İsmail Yavuz

19

Ich hatte das gleiche Problem mit Visual Studio beim Ausführen einer Webanwendung unter IIS Express. Um dies zu beheben, müssen Sie zu Ihren Projekteigenschaften gehen, dann auf die Registerkarte Debuggen klicken und http: // localhost: [IHR PORT] in http://127.0.0.1:[YOUR PORT] ändern und die Android-URL auf http: / setzen. /10.0.2.2:[IHR HAFEN ]. es hat bei mir funktioniert.


1
Dies in Verbindung mit der URL 10.0.0.2 löste es für mich. Diese Einstellung schien den an anderer Stelle erläuterten Hosting.json-Ansatz zu überschreiben.
user761574

1
Ich verwende den Django-Server lokal unter macOS und greife normalerweise http://localhost:5000/sowohl im Postman- als auch im iOS-Simulator darauf zu. Diese Lösung funktioniert für den Android-Simulator und muss weder meinen Server noch Einstellungen im Simulator ändern. Schnell, nett und portabel auf andere Computer ohne zusätzliche Arbeit.
John Pang

Android-App mit Xamarin- und ASP.NET-Web-APIs, die beide VS verwenden. HAT FUNKTIONIERT! Vielen Dank!!
Sohaib javed

15

Wenn Sie IIS Express verwenden, müssen Sie möglicherweise an alle Hostnamen anstatt nur an "localhost" binden. Überprüfen Sie diese gute Antwort:

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

Weisen Sie IIS Express an, sich an alle IP-Adressen und Hostnamen zu binden. Suchen Sie in Ihrer .config-Datei (normalerweise% userprofile% \ Eigene Dateien \ IISExpress \ config \ applicationhost.config oder $ (solutionDir) .vs \ config \ applicationhost.config für Visual Studio 2015) das Bindungselement Ihrer Site und fügen Sie es hinzu

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

Stellen Sie sicher, dass Sie es als zweite Bindung hinzufügen, anstatt die vorhandene zu ändern. Andernfalls fügt VS einfach eine neue Site hinzu, an die ein angehängt (1) ist. Möglicherweise müssen Sie VS auch als Administrator ausführen.


Nein, Sie müssen nicht immer den leeren Hostnamen blog.lextudio.com/…
Lex Li

<binding protocol = "http" bindingInformation = "*: 15000: 127.0.0.1" /> So mochte IIS Express, wo 15000 mein Port war, und zeigte dann auf 10.0.2.2:15000 auf dem Android-Emulator
dpineda

11

Ich habe es mit der Installation von "Conveyor by Keyoti" in Visual Studio Professional 2015 gelöst. Conveyor generiert eine REMOTE-Adresse (Ihre IP) mit einem Port (45455), der externe Anforderungen ermöglicht. Beispiel:

Geben Sie hier die Bildbeschreibung ein

Mit Conveyor können Sie Webanwendungen von externen Tablets und Telefonen in Ihrem Netzwerk oder von Android-Emulatoren (ohne http://10.0.2.2:<hostport>) testen.

Die Schritte befinden sich unter folgendem Link:

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


Was ist, wenn Sie den Webserver nicht in Visual Studio ausführen? Imo, das ist keine Antwort auf die Frage.
JAC

Ich versuche es, aber nach einigen Tagen funktioniert die angegebene URL nicht und findet keine Lösungen.
Md Imran Choudhury

Nach einem langen Kampf war das einzige, was den Trick tat, die Installation dieser Erweiterung und die Aktivierung der Remote-URL-Funktion. Es dauert etwas länger, bis die Anfrage die API erreicht, aber es funktioniert.
fabian278

9

Ich habe einen Webserver auf meinem lokalen Host.

Wenn ich den Emulator öffne und eine Verbindung zu meinem lokalen Host herstellen möchte, den ich verwende 192.168.x.x. Dies bedeutet, dass Sie Ihre lokale LAN-IP-Adresse verwenden sollten. Das bedeutet übrigens HttpResponseException (Bad Request)nicht, dass der Host nicht erreichbar ist.

Einige andere Fehler führen zu dieser Ausnahme.


9

Da 10.0.2.2es sich bei Android nicht um eine sichere Domain handelt, müssen Sie in Ihrer Netzwerkkonfiguration für API 28+ nicht gesicherte Domains zulassen, bei denen Nicht-TLS-Verbindungen standardmäßig verhindert werden.

Sie können meine folgenden Konfigurationen verwenden:

Erstellen Sie eine neue Datei in main / res / xml / network_security_config.xml wie folgt:

<?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>

Und zeigen Sie es in AndroidManifest.xml

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

8

Das Problem ist , dass der Android - Emulator Karten 10.0.2.2zu 127.0.0.1, nicht zu localhost. Konfigurieren Sie Ihren Webserver also auf Serveron 127.0.0.1:54722und nicht auf Serveron localhost:54722. Das sollte es tun.


7

Nachdem Sie Ihren lokalen Host ausgeführt haben, http://localhost:[port number]/haben Sie hier Ihre Portnummer gefunden.

Holen Sie sich dann Ihre IP-Adresse von Command, öffnen Sie Ihren Windows-Befehl und geben Sie ein ipconfig Geben Sie hier die Bildbeschreibung ein

In meinem Fall war IP 192.168.10.33so, dass meine URL http://192.168.10.33:[port number] / lautet . In Android verwendet das Studio diese URL als URL. Danach legen Sie Ihre URL und Ihre Portnummer im manuellen Proxy für den Emulator fest.

Geben Sie hier die Bildbeschreibung ein


3

Sie müssen die URL als festlegen 10.0.2.2:portNr

portNr = Der von ASP.NET Development Server angegebene Port, auf dem mein aktueller Dienst ausgeführt wird localhost:3229/Service.svc

so ist meine url 10.0.2.2:3229

Ich hatte mein Problem auf diese Weise behoben

Ich hoffe, es hilft...


3

"BadRequest" ist ein Fehler, der normalerweise vom Server selbst gesendet wurde, siehe RFC 2616

10.4.1 400 Bad Request

Die Anforderung konnte vom Server aufgrund einer fehlerhaften Syntax nicht verstanden werden. Der Client sollte die Anfrage NICHT ohne Änderungen wiederholen.

Sie haben also eine funktionierende Verbindung zum Server, aber Ihre Anfrage passt nicht zum erwarteten Formular. Ich weiß nicht, wie Sie die Verbindung herstellen, welche Header enthalten sind (falls vorhanden) - aber darauf sollten Sie achten.

Wenn Sie weitere Hilfe benötigen, erklären Sie, worum es in Ihrem Code geht und wie er eine Verbindung zum Server herstellt, damit wir das Gesamtbild haben.

Hier ist eine Frage mit demselben Problem - die Antwort war, dass der Inhaltstyp nicht in der Kopfzeile festgelegt wurde.


Sie haben den richtigen Punkt gefunden, sind danach aber in die falsche Richtung gegangen. Der nächste Schritt sollte darin bestehen, den Server zu analysieren, um herauszufinden
Lex Li

1

Ich möchte Ihnen zeigen, wie ich von meinem Android-Emulator aus auf IISExpress-Web-APIs zugreife. Ich verwende Visual Studio 2015. Und ich rufe den Android Emulator von Android Studio aus auf.

Ich muss lediglich die folgende Zeile zur Bindungskonfiguration in meiner Datei applicationhost.config hinzufügen

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

Dann überprüfe ich die IP4-Adresse und verwende sie, um vom Android-Emulator auf meine API zuzugreifen

Voraussetzung: Sie müssen Visual Studio als Administrator ausführen. Dieser Beitrag bietet eine perfekte Möglichkeit, dies zu tun.

Für weitere Informationen besuchen Sie bitte meinen Beitrag auf Github

Hoffe das hilft.


2
Oder installieren Sie die kostenlose VS-Erweiterung Conveyor im Fenster Erweiterungen. Dadurch wird IIS Express für externe Anforderungen geöffnet, ohne die Konfiguration zu ändern.
Jim W sagt, Monica

Sie haben andere Optionen, blog.lextudio.com/…, als VS als Administrator auszuführen . Ich werde das also nicht als Muss bezeichnen .
Lex Li

1

Für Laravel Homestead-Benutzer: Wenn jemand Laravel mit Homestead verwendet, können Sie mit 192.168.10.10 im Emulator auf das App-Backend zugreifen

Funktioniert immer noch nicht? Eine andere gute Lösung ist die Verwendung von ngrok https://ngrok.com/


1

Ich verwende Windows 10 als meine Entwicklungsplattform. Der Zugriff auf 10.0.2.2:port in meinem Emulator funktioniert nicht wie erwartet und das gleiche Ergebnis auch für andere Lösungen in dieser Frage.

Nach einigen Stunden des Grabens stellte ich fest, dass die Dinge einfach funktionieren , wenn Sie dem Startbefehl des Emulators das Argument -writable-system hinzufügen .

Sie müssen einen Emulator über die folgende Befehlszeile starten:

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

Anschließend können Sie in Ihrem Emulator mithilfe der LAN-IP-Adresse und des Bindungsports auf Ihren API-Dienst zugreifen, der auf dem Hostcomputer ausgeführt wird:

http://192.168.1.2:<port>

Hoffe das hilft dir weiter.

Informationen zum Starten des Emulators über die Befehlszeile: https://developer.android.com/studio/run/emulator-commandline .


1

Zugriff auf localhost über Android Emulator

  • Fügen Sie die Internetberechtigung von AndroidManifest.xml hinzu
    <uses-permission android:name="android.permission.INTERNET" />

  • In android:usesCleartextTraffic="true"mehr Details hier :

  • Führen Sie den folgenden Befehl aus, um die IP-Adresse Ihres Systems zu ermitteln:

ifconfig | grep "inet " | grep -v 127.0.0.1

Kopieren Sie die aus diesem Schritt erhaltene IP-Adresse (A).

  • Führen Sie Ihre Backend-Anwendung aus, auf die Sie über localhostoder 127.0.0.1von Ihrem System aus zugreifen können.

  • Jetzt in Android Studio können Sie die URL ersetzen, wenn Sie Code verwenden, oder Sie können die IP-Adresse aus Schritt (A) verwenden und versuchen, sie im Webbrowser zu öffnen. Gefällt mir http://192.168.0.102:8080/

Vergessen Sie nicht, PORT nach der IP-Adresse hinzuzufügen. In meinem Fall wurde die App auf dem 8080-Port ausgeführt, sodass ich die in (A) erhaltene IP mit dem Port 8080 hinzugefügt habe


0

localhost schien beim Start in meinem Emulator einwandfrei zu funktionieren, und dann bekam ich die Ausnahme "Verbindung verweigert". Ich verwendete 127.0.2.2 vom Emulator-Browser und es funktionierte. Als ich dies in meiner Android-App im Emulator verwendete, wurde erneut das Problem "Verbindung verweigert" angezeigt .

dann habe ich ifconfig gemacht und ich habe die ip 192.168.2.2 benutzt und es hat perfekt funktioniert


0

Eine fehlerhafte Anfrage bedeutet im Allgemeinen, dass das Format der von Ihnen gesendeten Daten falsch ist. Möglicherweise stimmt die Datenzuordnung nicht überein. Wenn Sie eine schlechte Anfrage erhalten, bedeutet dies, dass Sie eine Verbindung zum Server herstellen können, die Anfrage jedoch nicht ordnungsgemäß gesendet wird.


0

Wenn noch jemand danach sucht, hat es bei mir so funktioniert.

Sie müssen die IP Ihres Computers in Bezug auf das Gerät / den Emulator ermitteln, mit dem Sie verbunden sind. Für Emulatoren ist der Weg durch Befolgen der folgenden Schritte;

  1. Gehen Sie zum Feld VM Virtual -> wählen Sie das verbundene Gerät in der Liste aus.
  2. Wählen Sie Einstellungen -> Netzwerk-> Finden Sie heraus, an welches Netzwerk das Gerät angeschlossen ist. Für mich war es 'VirtualBox Host-Only Ethernet Adapter # 2'.
  3. Gehen Sie in virtualbox zu Dateien-> Einstellungen-> Netzwerk-> Nur-Host-Netzwerke und ermitteln Sie die IPv4 für das im obigen Schritt angegebene Netzwerk. (Durch Schweben erhalten Sie die Informationen)

Geben Sie diese IP an, um vom Emulator aus auf den lokalen Host zuzugreifen. Der Port ist derselbe, den Sie beim Ausführen / Veröffentlichen Ihrer Dienste angegeben haben.

Anmerkung 1 : Stellen Sie sicher, dass Sie sich um Firewalls und eingehende Regeln gekümmert haben.

Hinweis 2: Überprüfen Sie diese IP-Adresse, nachdem Sie Ihren Computer neu gestartet haben. Aus irgendeinem Grund wurde die Nur-Host-IP geändert, auch wenn ich "Folgende IP verwenden" angegeben habe.


0

Ich habe das Problem genau behoben, wenn die Serviceschicht Visual Studio IIS Express verwendet. Zeigen Sie einfach auf 10.0.2.2:port funktioniert nicht. Anstatt den IIS Express herumzuspielen, wie in anderen Beiträgen erwähnt, habe ich einfach einen Proxy vor den IIS Express gestellt. Zum Beispiel Apache oder Nginx. Die nginx.conf sieht so aus

 # Mobile API
 server { 
    listen       8090;
    server_name  default_server;

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

Dann muss der Android auf meine IP-Adresse als 192.168.xx: 8090 zeigen


0

Wenn Sie ein Paket eines Drittanbieters wie Node Express oder Angular-CLI verwenden, müssen Sie die IP Ihres Computers ermitteln und Ihren Host in der Server-Startkonfiguration (anstelle von localhost) an diese IP anhängen. Starten Sie es dann über die IP vom Emulator. Zum Beispiel musste ich verwenden: ng serve -H 10.149.212.104um die Winkel-Cli zu verwenden. Dann habe ich vom Emulator Folgendes verwendet:http://10.149.212.104:4200


0

1) Führen Sie den Befehl ipconfig in cmd aus

2) Sie erhalten ein Ergebnis wie dieses Geben Sie hier die Bildbeschreibung ein

3) Verwenden Sie dann die IPv4-Adresse von VMWare Network Adapter 1, gefolgt von der Portnummer

In meinem Fall ist es 8080, also anstatt localhost zu verwenden: 8080

Ich verwende 192.168.56.1:8080

Geben Sie hier die Bildbeschreibung ein

Getan.....


0

Erläuterung, warum localhostEmulatoren für Personen mit grundlegenden Zugriffsproblemen nicht verfügbar sind. Für anspruchsvolle Fälle lesen Sie andere Antworten.

Problem: Der Emulator hat ein eigenes lokales Netzwerk und localhostordnet sich dem Emulator zu , aber NICHT Ihrem Host!

Lösung:

  1. Binden Sie Ihren Server an 0.0.0.0, um ihn für das Netzwerk des Emulators verfügbar zu machen
  2. Holen Sie sich die externe IP-Adresse Ihres Laptops: ifconfigBefehl für Mac
  3. Verwenden Sie in Android (oder Flutter-App) die IP-Adresse Ihrer externen Schnittstelle wie: 192.168.1.10anstelle vonlocalhost

0

Ich hatte das gleiche Problem, als ich versuchte, über den Android-Emulator eine Verbindung zu meinem IIS .NET-Webservice herzustellen.

  1. Installieren npm install -g iisexpress-proxy
  2. iisexpress-proxy 53990 to 9000 Proxy IIS Express Port auf 9000 und Zugriff auf Port 9000 vom Emulator wie "http://10.0.2.2:9000"

Der Grund scheint standardmäßig zu sein: IIS Express erlaubt keine Verbindungen vom Netzwerk https://forums.asp.net/t/2125232.aspx?Bad+Request+Invalid+Hostname+wenn+zugriff auf +localhost+Web+ API + oder + Web + App + von + über + LAN

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.