Accesso a localhost: porta dall'emulatore Android


224

Sto eseguendo un servizio web sul mio computer locale che funziona a localhost:54722.

Voglio chiamare il servizio da un'app in esecuzione nell'emulatore Android.

Ho letto che l'uso 10.0.2.2nell'app avrebbe accesso a localhost, ma non sembra funzionare anche con il numero di porta. Dice HttpResponseException: Bad Request.



1
Mi aspettavo il comportamento, che non tutte le porte venivano inoltrate ... 5555 non veniva inoltrato ma 8080 e 8081 funzionavano perfettamente ...
Florian Loch

Devi modificare il tuo file di configurazione vs-iis: stackoverflow.com/a/50991257/7149454
Nick Kovalsky,

Risposte:


408

Puoi accedere al tuo computer host con l'indirizzo IP " 10.0.2.2".

Questo è stato progettato in questo modo dal team di Android. Quindi il tuo server web può funzionare perfettamente su localhost e dalla tua app Android puoi accedervi tramite " http://10.0.2.2:<hostport>".

Se l'emulatore deve accedere a Internet tramite un server proxy, è possibile configurare un proxy HTTP personalizzato dalla schermata dei controlli estesi dell'emulatore. Con l'emulatore aperto, fai clic su Altro puntini , quindi su Impostazioni e Proxy . Da qui, puoi definire le tue impostazioni proxy HTTP. schermata per la configurazione HTTP


9
Perché dovrebbe? L'errore Bad Request significa che il server localhost è raggiungibile, ma che la richiesta non è del tutto corretta ..
Dediqated

non sono sicuro, lo seguo, cosa stai dicendo esattamente, è rilevante per la soluzione fornita ??
Akhil Jain,

Non funziona per me in questo momento, ma ecco il link ai documenti Android ed è chiaro che questo è ciò che dovrebbe fare (10.0.2.2); developer.android.com/tools/devices/emulator.html
Stuart Hallows

23
ovviamente questo non chiarisce nulla, Robin sta già usando 10.0.2.2 ip nella domanda e non funziona. Sebbene la tua risposta sia corretta, NON fornisce una soluzione.
iversoncru,

Anch'io ottengo 400: errore di richiesta errata con la stessa soluzione.
Keval Patel,

55

Utilizzare 10.0.2.2 per AVD predefinito e 10.0.3.2 per Genymotion


4
Perché 10.0.3.2 per Genymotion?
Jacob,

1
@Jacob Perché Genymotion è un emulatore diverso e hanno scelto di utilizzare un IP diverso dall'emulatore di Google (che rasenta inutilmente. Davvero, quando faranno qualcosa per il loro terribile emulatore predefinito?)
computrius

In API 28+ dovresti consentire esplicitamente anche il traffico non https (testo in chiaro) nella tua configurazione di rete. Vedi la mia risposta sotto stackoverflow.com/a/56769746/2290369
İsmail Yavuz

19

Ho riscontrato lo stesso problema con Visual Studio nell'esecuzione di un'app Web su IIS Express. per risolverlo è necessario andare alle proprietà del progetto, quindi fare clic sulla scheda Debug e modificare http: // localhost: [YOUR PORT] in http://127.0.0.1:[YOUR PORT] e impostare l'URL Android su http: / /10.0.2.2:[YOUR PORT]. ha funzionato per me.


1
questo in combinazione con l'URL 10.0.0.2 lo ha risolto per me. questa impostazione sembrava prevalere sull'approccio hosting.json spiegato altrove.
user761574

1
Sto eseguendo il server django localmente su macOS e di solito accedo tramite il http://localhost:5000/simulatore Postman e iOS. Questa soluzione funziona per il simulatore Android e non è necessario modificare il mio server, né alcuna impostazione nel simulatore. Veloce, piacevole e portatile su altri computer senza lavoro extra.
John Pang,

App Android con xamarin e API Web ASP.NET entrambe con VS. LAVORATO! Grazie!!
Sohaib è uscito il

15

Se si utilizza IIS Express, potrebbe essere necessario eseguire il bind a tutti i nomi host anziché a "localhost". Controlla questa bella risposta:

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

Di 'a IIS Express stesso di collegarsi a tutti gli indirizzi IP e i nomi host. Nel tuo file .config (in genere% userprofile% \ My Documents \ IISExpress \ config \ applicationhost.config o $ (solutionDir) .vs \ config \ applicationhost.config per Visual Studio 2015), trova l'elemento di associazione del tuo sito e aggiungi

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

Assicurati di aggiungerlo come secondo binding invece di modificare quello esistente o VS aggiungerà semplicemente un nuovo sito aggiunto con un (1) Inoltre, potrebbe essere necessario eseguire VS come amministratore.


No, non è sempre necessario utilizzare un nome host vuoto, blog.lextudio.com/…
Lex Li

<binding protocol = "http" bindingInformation = "*: 15000: 127.0.0.1" /> questo era il modo in cui IIS Express amava dove 15000 era la mia porta e quindi puntava su 10.0.2.2:15000 sull'emulatore Android
dpineda,

11

L'ho risolto con l'installazione di "Conveyor by Keyoti" in Visual Studio Professional 2015. Il trasportatore genera un indirizzo REMOTO (il tuo IP) con una porta (45455) che abilita la richiesta esterna. Esempio:

inserisci qui la descrizione dell'immagine

Conveyor ti consente di testare applicazioni Web da tablet e telefoni esterni sulla tua rete o da emulatori Android (senza http://10.0.2.2:<hostport>)

I passaggi sono nel seguente link:

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


Cosa succede se non si esegue il server Web in Visual Studio? Imo, questa non è una risposta alla domanda.
jAC

Ci provo, ma dopo alcuni giorni l'URL indicato non funziona e non trovo alcuna soluzione.
Md Imran Choudhury,

Dopo una lunga lotta, l'unica cosa che ha fatto il trucco è stata l'installazione di questa estensione e l'abilitazione della funzione URL remoto. La richiesta impiega un po 'più tempo a raggiungere l'API, ma funziona.
fabian278,

9

Ho un server web in esecuzione sul mio localhost.

Se apro l'emulatore e voglio connettermi al mio localhost che sto usando 192.168.x.x. Questo significa che dovresti usare il tuo indirizzo IP locale. A proposito, il tuo HttpResponseException (Bad Request)non significa che l'host non è raggiungibile.

Alcuni altri errori portano a questa eccezione.


9

Poiché 10.0.2.2non è un dominio protetto per Android, è necessario consentire domini non protetti nella configurazione di rete per API 28+ in cui le connessioni non TLS sono impedite per impostazione predefinita.

Puoi usare le mie seguenti configurazioni:

Crea un nuovo file in main / res / xml / network_security_config.xml come:

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

E puntalo in AndroidManifest.xml

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

8

Il problema è che l'emulatore Android esegue il mapping 10.0.2.2a 127.0.0.1, non a localhost. Quindi configura il tuo server web su serveron 127.0.0.1:54722e non localhost:54722. Questo dovrebbe farlo.


7

Dopo aver eseguito l'host locale, arrivi http://localhost:[port number]/qui, hai trovato il tuo numero di porta.

Quindi ottieni il tuo indirizzo IP da Comando, apri il tuo comando windows e digita ipconfig inserisci qui la descrizione dell'immagine

Nel mio caso, IP è stato 192.168.10.33quindi il mio URL sarà http://192.168.10.33:[port number] /. In Android, lo studio utilizza questo URL come URL. E successivamente imposta l'URL e il numero di porta nel proxy manuale per l'emulatore.

inserisci qui la descrizione dell'immagine


3

devi impostare l'URL come 10.0.2.2:portNr

portNr = la porta fornita da ASP.NET Development Server su cui è in esecuzione il mio servizio attuale localhost:3229/Service.svc

quindi il mio URL è 10.0.2.2:3229

avevo risolto il mio problema in questo modo

spero possa essere d'aiuto...


3

"BadRequest" è un errore che di solito viene inviato dal server stesso, vedere rfc 2616

10.4.1 400 Richiesta non valida

La richiesta non è stata compresa dal server a causa di una sintassi non corretta. Il client NON DOVREBBE ripetere la richiesta senza modifiche.

Quindi hai una connessione funzionante al server, ma la tua richiesta non si adatta al modulo expecet. Non so come si crea la connessione, quali intestazioni sono incluse (se ce ne sono), ma questo è ciò che si dovrebbe verificare.

Se hai bisogno di ulteriore aiuto, spiega di cosa tratta il tuo codice e cosa utilizza per connettersi al server, quindi abbiamo il quadro generale.

Ecco una domanda con lo stesso problema: la risposta era che il tipo di contenuto non era impostato nell'intestazione.


Hai ottenuto il punto giusto, ma in seguito è andata nella direzione sbagliata. Il prossimo passo dovrebbe essere l'analisi del server per sapere che tipo di richieste si preoccupa, in modo da capire perché le richieste degli emulatori rispondono con 400. Un case study per IIS Express è disponibile qui, blog.lextudio.com/…
Lex Li

1

Vorrei mostrarti come accedo alle API Web IISExpress dal mio emulatore Android. Sto usando Visual Studio 2015. E chiamo l'emulatore Android da Android Studio.

Tutto quello che devo fare è aggiungere la seguente riga alla configurazione dell'associazione nel mio file applicationhost.config

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

Quindi controllo e utilizzo l'indirizzo IP4 per accedere alla mia API dall'emulatore Android

Requisito: è necessario eseguire Visual Studio come amministratore. Questo post offre un modo perfetto per farlo.

Per maggiori dettagli, visita il mio post su github

Spero che questo ti aiuti.


2
Oppure installa l'estensione VS gratuita chiamata Conveyor dalla finestra Estensioni. Ciò apre IIS Express a richieste esterne senza modificare la configurazione.
Jim W dice di ripristinare Monica il

Hai altre opzioni, blog.lextudio.com/… che eseguire VS come amministratore. Quindi non lo chiamerò un must .
Lex Li

1

Per gli utenti di Laravel Homestead: se qualcuno utilizza Laravel con homestead è possibile accedere al back-end dell'app utilizzando l'emulatore 192.168.10.10

Continua a non funzionare? Un'altra buona soluzione è utilizzare ngrok https://ngrok.com/


1

Sto usando Windows 10 come piattaforma di sviluppo, l'accesso a 10.0.2.2:port nel mio emulatore non funziona come previsto e lo stesso risultato anche per altre soluzioni in questa domanda.

Dopo diverse ore di scavo, ho scoperto che se aggiungi l' argomento -writable-system al comando di avvio dell'emulatore, le cose funzioneranno.

Devi avviare un emulatore dalla riga di comando come di seguito:

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

Quindi, nell'emulatore, puoi accedere al servizio API in esecuzione sul computer host, utilizzando l'indirizzo IP LAN e la porta di associazione:

http://192.168.1.2:<port>

Spero che questo ti aiuti.

Informazioni sull'avvio dell'emulatore dalla riga di comando: https://developer.android.com/studio/run/emulator-commandline .


1

Per accedere a localhost sull'emulatore Android

  • Aggiungi l'autorizzazione Internet da AndroidManifest.xml
    <uses-permission android:name="android.permission.INTERNET" />

  • Aggiungi android:usesCleartextTraffic="true", maggiori dettagli qui :

  • Esegui il comando seguente per trovare il tuo indirizzo IP di sistema:

ifconfig | grep "inet " | grep -v 127.0.0.1

Copia l'indirizzo IP ottenuto da questo passaggio (A)

  • Esegui la tua applicazione back-end, a cui puoi accedere dal localhosto 127.0.0.1dal tuo sistema.

  • Ora in Android Studio, è possibile sostituire l'URL se si utilizza nel codice oppure È possibile utilizzare l'indirizzo IP ottenuto dal passaggio (A) e provare ad aprire nel browser Web, in questo modo http://192.168.0.102:8080/

Non dimenticare di aggiungere PORT dopo l'indirizzo IP, nel mio caso l'app era in esecuzione sulla porta 8080, quindi ho aggiunto l'IP ottenuto in (A) con la porta 8080


0

localhost sembrava funzionare bene nel mio emulatore all'avvio e poi ho iniziato a ricevere la connessione rifiutata eccezione ho usato 127.0.2.2 dal browser dell'emulatore e ha funzionato e quando l'ho usato nella mia app Android nell'emulatore ha ricominciato a mostrare il problema della connessione rifiutata .

poi ho fatto ifconfig e ho usato l'ip 192.168.2.2 e ha funzionato perfettamente


0

Richiesta errata generalmente significa che il formato dei dati che stai inviando non è corretto. Può essere una mappatura dei dati non corrispondente. Se si riceve una richiesta non valida, è possibile connettersi al server, ma la richiesta non viene inviata correttamente.


0

Se qualcuno lo sta ancora cercando, è così che ha funzionato per me.

Devi trovare l'IP della tua macchina rispetto al dispositivo / emulatore a cui sei connesso. Per gli emulatori la strada è seguendo i passaggi seguenti;

  1. Vai alla casella virtuale VM -> seleziona il dispositivo connesso nell'elenco.
  2. Seleziona Impostazioni -> Rete-> Scopri a quale rete è collegato il dispositivo. Per me era "Scheda Ethernet solo host 2 VirtualBox".
  3. In virtualbox vai su File-> Preferenze-> Rete-> Reti solo host e scopri IPv4 per la rete specificata nel passaggio precedente. (Passando il mouse otterrai le informazioni)

Fornire questo IP per accedere all'host locale dall'emulatore. La porta è la stessa fornita durante l'esecuzione / pubblicazione dei servizi.

Nota n. 1: assicurati di aver curato i firewall e le regole in entrata.

Nota n. 2: controllare questo IP dopo aver riavviato il computer. Per qualche motivo, anche se ho fornito "Usa il seguente IP", l'IP solo host è stato modificato.


0

Ho risolto esattamente il problema quando il livello di servizio utilizza Visual Studio IIS Express. Basta puntare su 10.0.2.2:port non funzionerà. Invece di scherzare con IIS Express, come menzionato da altri post, ho appena messo un proxy davanti a IIS Express. Ad esempio, apache o nginx. Apparirà nginx.conf

 # Mobile API
 server { 
    listen       8090;
    server_name  default_server;

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

Quindi Android deve indicare il mio indirizzo IP come 192.168.xx: 8090


0

se stai usando un pacchetto di terze parti come node express o angular-cli dovrai trovare l'IP della tua macchina e collegare il tuo host a quell'IP all'interno della configurazione di avvio del server (invece di localhost). Quindi avviarlo dall'emulatore utilizzando l'IP. Ad esempio, ho dovuto usare: ng serve -H 10.149.212.104per usare l'angular-cli. Quindi dall'emulatore ho usato:http://10.149.212.104:4200


0

1) Esegui il comando ipconfig in cmd

2) Otterrai risultati così inserisci qui la descrizione dell'immagine

3) Quindi utilizzare l'indirizzo IPv4 dell'adattatore di rete 1 VMWare seguito dal numero di porta

Nel mio caso è 8080, quindi invece di usare localhost: 8080

Sto usando 192.168.56.1:8080

inserisci qui la descrizione dell'immagine

Fatto.....


0

Spiegazione del motivo per cui localhostnon è disponibile dagli emulatori per chiunque abbia problemi di accesso di base. Per casi sofisticati leggi altre risposte.

Problema: l' emulatore ha una propria rete locale e si localhostassocia all'emulatore , ma NON al tuo host!

Soluzione:

  1. Associare il server a 0.0.0.0renderlo disponibile per la rete dell'emulatore
  2. Ottieni l'indirizzo IP esterno del tuo laptop: ifconfigcomando per Mac
  3. In Android (o app Flutter) usa l'indirizzo IP della tua interfaccia esterna come: 192.168.1.10invece dilocalhost

0

Ho avuto lo stesso problema quando stavo cercando di connettermi al mio Webservice IIS .NET dall'emulatore Android.

  1. installare npm install -g iisexpress-proxy
  2. iisexpress-proxy 53990 to 9000 per delegare la porta IIS express a 9000 e accedere alla porta 9000 dall'emulatore come "http://10.0.2.2:9000"

il motivo sembra essere predefinito, IIS Express non consente connessioni dalla rete https://forums.asp.net/t/2125232.aspx?Bad+Request+Invalid+Hostname+when+accessing+localhost+Web+API + o + Web + App + da + tutta + LAN

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.