Dostęp do localhost: port z emulatora Androida

224

Korzystam z usługi internetowej na moim komputerze lokalnym, który działa na localhost:54722.

Chcę zadzwonić do usługi z aplikacji uruchomionej w emulatorze Androida.

Przeczytałem, że użycie 10.0.2.2w aplikacji może uzyskać dostęp do localhost, ale wydaje się, że nie działa również z numerem portu. To mówi HttpResponseException: Bad Request.

Rudzik
źródło
1
Spodziewałem się zachowania, że ​​nie wszystkie porty są przekazywane ... 5555 nie zostało przekazane dalej, ale 8080 i 8081 działały dobrze ...
Florian Loch
Musisz edytować plik konfiguracji vs-iis: stackoverflow.com/a/50991257/7149454
Nick Kovalsky

Odpowiedzi:

408

Możesz uzyskać dostęp do komputera hosta za pomocą adresu IP „ 10.0.2.2”.

Zostało to zaprojektowane w ten sposób przez zespół Androida. Dzięki temu Twój serwer może doskonale działać na localhost, a z aplikacji na Androida możesz uzyskać do niego dostęp za pośrednictwem „ http://10.0.2.2:<hostport>”.

Jeśli emulator musi mieć dostęp do Internetu za pośrednictwem serwera proxy, możesz skonfigurować niestandardowy serwer proxy HTTP na ekranie rozszerzonych kontrolek emulatora. Przy otwartym emulatorze kliknij opcję Więcej kropki , a następnie kliknij opcję Ustawienia i serwer proxy . Tutaj możesz zdefiniować własne ustawienia proxy HTTP. zrzut ekranu dla konfiguracji HTTP

Akhil Jain
źródło
9
Dlaczego to powinno? Błąd Błędne żądanie oznacza, że ​​serwer localhost jest osiągalny, ale żądanie nie jest całkiem poprawne.
Dediqated
nie jestem pewien, śledzę, co dokładnie mówisz, czy ma to związek z dostarczonym rozwiązaniem?
Akhil Jain
W tej chwili dla mnie nie działa, ale tutaj jest link do dokumentów Androida i jasne jest, że właśnie to powinno to zrobić (10.0.2.2); developer.android.com/tools/devices/emulator.html
Stuart Hallows
23
oczywiście to niczego nie wyjaśnia, Robin już używa 10.0.2.2 ip w pytaniu i nie działa. Chociaż twoja odpowiedź jest prawidłowa, NIE zapewnia rozwiązania.
iversoncru
Też dostaję 400: Błąd złego żądania z tym samym rozwiązaniem.
Keval Patel
55

Użyj 10.0.2.2 dla domyślnego AVD i 10.0.3.2 dla Genymotion

Vinod Joshi
źródło
4
Dlaczego 10.0.3.2 dla Genymotion?
Jacob
1
@Jacob Ponieważ Genymotion jest innym emulatorem i zdecydowali się użyć innego adresu IP niż emulator Google'a (który graniczy z bezużytecznością. Poważnie, kiedy zrobią coś z ich okropnym domyślnym emulatorem?)
Computrius
W API 28+ należy również wyraźnie zezwolić na ruch inny niż https (tekst jawny) w konfiguracji sieci. Zobacz moją odpowiedź poniżej stackoverflow.com/a/56769746/2290369
İsmail Yavuz
19

Ten sam problem wystąpił w programie Visual Studio podczas uruchamiania aplikacji internetowej w IIS Express. aby to naprawić, musisz przejść do właściwości projektu, a następnie kliknąć kartę Debugowanie i zmienić http: // localhost: [TWÓJ PORT] na http://127.0.0.1:[YOUR PORT] i ustawić adres URL Androida na http: / /10.0.2.2:[YOUR PORT]. zadziałało dla mnie.

Ehsan Zargar Ershadi
źródło
1
to w połączeniu z adresem URL 10.0.0.2 rozwiązało to dla mnie. to ustawienie wydawało się zastępować podejście host.json wyjaśnione w innym miejscu.
user761574,
1
Korzystam z serwera django lokalnie na macOS i zwykle uzyskuję do niego dostęp za pośrednictwem http://localhost:5000/zarówno Postmana, jak i symulatora iOS. To rozwiązanie działa na symulatorze Androida i nie trzeba modyfikować mojego serwera ani żadnych ustawień w symulatorze. Szybki, ładny i przenośny na inne komputery bez dodatkowej pracy.
John Pang
Aplikacja na Androida z interfejsami API xamarin i ASP.NET Web przy użyciu VS. DZIAŁAŁO! Dzięki!!
sohaib javed
15

Jeśli używasz IIS Express, być może będziesz musiał powiązać wszystkie nazwy hostów zamiast po prostu `localhost '. Sprawdź tę dobrą odpowiedź:

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

Powiedz IIS Express, aby powiązał się ze wszystkimi adresami IP i nazwami hostów. W pliku .config (zwykle% userprofile% \ My Documents \ IISExpress \ config \ applicationhost.config lub $ (solutionDir) .vs \ config \ applicationhost.config dla Visual Studio 2015) znajdź element powiązania witryny i dodaj

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

Pamiętaj, aby dodać go jako drugie powiązanie, zamiast modyfikować istniejący. W przeciwnym razie VS ponownie doda nową witrynę, do której dołączono (1) również. Może być konieczne uruchomienie VS jako administrator.

Hugh Jeffner
źródło
Nie, nie zawsze musisz używać pustej nazwy hosta blog.lextudio.com/…
Lex Li
<protokołem wiązania = "http" bindingInformation = "*: 15000: 127.0.0.1" /> w ten sposób IIS Express lubił, gdzie 15000 był moim portem, a następnie wskazywał 10.0.2.2:15000 na emulatorze Androida
dpineda,
11

Rozwiązałem go, instalując „Conveyor by Keyoti” w Visual Studio Professional 2015. Conveyor generuje adres REMOTE (twoje IP) za pomocą portu (45455), który umożliwia żądanie zewnętrzne. Przykład:

wprowadź opis zdjęcia tutaj

Conveyor pozwala testować aplikacje internetowe z zewnętrznych tabletów i telefonów w sieci lub z emulatorów Androida (bez http://10.0.2.2:<hostport>)

Kroki znajdują się w następującym linku:

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

Ronny Morán
źródło
Co się stanie, jeśli nie uruchomisz serwera WWW w programie Visual Studio? Imo, to nie jest odpowiedź na pytanie.
jAC
Próbuję, ale po kilku dniach później podany adres URL nie działa i nie znajduję żadnych rozwiązań.
Md Imran Choudhury
Po długich zmaganiach jedyną rzeczą, która pomogła, była instalacja tego rozszerzenia i włączenie funkcji zdalnego adresu URL. Uaktywnienie interfejsu API zajmuje trochę dłużej, ale działa.
fabian278
9

Mam serwer WWW uruchomiony na moim lokalnym hoście.

Jeśli otworzę emulator i chcę połączyć się z lokalnym hostem, którego używam 192.168.x.x. Oznacza to, że powinieneś używać lokalnego adresu LAN IP. Nawiasem mówiąc, HttpResponseException (Bad Request)nie oznacza to, że host jest nieosiągalny.

Niektóre inne błędy prowadzą do tego wyjątku.

Marco
źródło
9

Ponieważ 10.0.2.2nie jest to bezpieczna domena dla Androida, musisz zezwolić na niezabezpieczone domeny w konfiguracji sieci dla API 28+, w których domyślnie uniemożliwia się połączenia inne niż TLS.

Możesz użyć moich następujących konfiguracji:

Utwórz nowy plik w main / res / xml / network_security_config.xml jako:

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

I wskaż to w AndroidManifest.xml

<application
......
......
android:networkSecurityConfig="@xml/network_security_config">
İsmail Yavuz
źródło
8

Problem polega na tym, że emulator Androida odwzorowuje 10.0.2.2na 127.0.0.1, a nie na localhost. Więc skonfiguruj swój serwer WWW do serveron, 127.0.0.1:54722a nie localhost:54722. Że należy to zrobić.

Cobus Kruger
źródło
7

Po uruchomieniu lokalnego hosta znajdziesz http://localhost:[port number]/tutaj swój numer portu.

Następnie uzyskaj adres IP z polecenia, otwórz polecenie systemu Windows i wpisz ipconfig wprowadź opis zdjęcia tutaj

W moim przypadku adres IP był 192.168.10.33taki, że mój URL to http://192.168.10.33:[portport ] /. W systemie Android studio używa tego adresu URL jako adresu URL. Następnie ustaw adres URL i numer portu w ręcznym proxy dla emulatora.

wprowadź opis zdjęcia tutaj

Md Imran Choudhury
źródło
3

musisz ustawić URL jako 10.0.2.2:portNr

portNr = podany port przez ASP.NET Development Server, na którym działa moja bieżąca usługa localhost:3229/Service.svc

więc mój adres URL to 10.0.2.2:3229

w ten sposób naprawiłem swój problem

Mam nadzieję, że to pomoże...

Lomec
źródło
3

„BadRequest” jest błędem, który zwykle jest wysyłany przez sam serwer, patrz rfc 2616

10.4.1 400 Zła prośba

Serwer nie mógł zrozumieć żądania z powodu nieprawidłowej składni. Klient NIE POWINIEN powtarzać żądania bez modyfikacji.

Masz więc działające połączenie z serwerem, ale twoje zapytanie nie pasuje do formularza expecet. Nie wiem, jak tworzysz połączenie, jakie nagłówki są uwzględniane (jeśli takie istnieją) - ale właśnie to powinieneś sprawdzić.

Jeśli potrzebujesz dodatkowej pomocy, wyjaśnij, na czym polega Twój kod i czego używa do łączenia się z serwerem, abyśmy mieli pełny obraz.

Oto pytanie z tym samym problemem - odpowiedź brzmiała, że ​​typ treści nie został ustawiony w nagłówku.

Marvin Emil Brach
źródło
Masz właściwy punkt, ale potem poszedłeś w złym kierunku. Następnym krokiem powinno być przeanalizowanie serwera, aby dowiedzieć się, na jakich żądaniach się ono przejmuje, aby zrozumieć, dlaczego odpowiedzi na żądania emulatorów odpowiadają 400. Studium przypadku dla IIS Express można znaleźć tutaj, blog.lextudio.com/...
Lex Li
1

Chciałbym pokazać, w jaki sposób uzyskuję dostęp do interfejsów API sieci Web IISExpress z mojego emulatora Androida. Używam Visual Studio 2015. I nazywam emulator Androida z Android Studio.

Wszystko, co muszę zrobić, to dodać następujący wiersz do konfiguracji wiązania w moim pliku applicationhost.config

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

Następnie sprawdzam i używam adresu IP4, aby uzyskać dostęp do mojego interfejsu API z emulatora Androida

Wymagania: musisz uruchomić Visual Studio jako Administrator. Ten post stanowi doskonały sposób na zrobienie tego.

Aby uzyskać więcej informacji, odwiedź mój post na github

Mam nadzieję że to pomoże.

Nguyen Minh Hien
źródło
2
Lub zainstaluj bezpłatne rozszerzenie VS o nazwie Przenośnik z okna Rozszerzenia. To otwiera IIS Express na żądania zewnętrzne bez zmiany konfiguracji.
Jim W mówi o przywróceniu Moniki
Masz inne opcje, blog.lextudio.com/... niż uruchamianie VS jako administrator. Więc nie zadzwoni, że moszczu .
Lex Li
1

Dla użytkowników Laravel Homestead: jeśli ktoś korzystający z Laravel z homestead, możesz uzyskać dostęp do wewnętrznej aplikacji za pomocą 192.168.10.10 w emulatorze

Wciąż nie działa? Innym dobrym rozwiązaniem jest użycie ngrok https://ngrok.com/

Nomi
źródło
1

Używam systemu Windows 10 jako platformy programistycznej, dostęp do portu 10.0.2.2:port w emulatorze nie działa zgodnie z oczekiwaniami, a ten sam wynik również w przypadku innych rozwiązań w tym pytaniu.

Po kilku godzinach kopania odkryłem, że jeśli dodasz argument -writable-system do polecenia uruchamiania emulatora, wszystko po prostu zadziała.

Musisz uruchomić emulator za pomocą wiersza poleceń, jak poniżej:

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

Następnie w emulatorze możesz uzyskać dostęp do usługi API działającej na hoście, używając adresu IP LAN i portu wiązania:

http://192.168.1.2:<port>

Mam nadzieję, że to ci pomoże.

Informacje o uruchomieniu emulatora z wiersza poleceń: https://developer.android.com/studio/run/emulator-commandline .

winiex
źródło
1

Aby uzyskać dostęp do localhost na emulatorze Androida

  • Dodaj uprawnienie internetowe z AndroidManifest.xml
    <uses-permission android:name="android.permission.INTERNET" />

  • Dodaj android:usesCleartextTraffic="true", więcej szczegółów tutaj :

  • Uruchom poniższe polecenie, aby znaleźć adres IP systemu:

ifconfig | grep "inet " | grep -v 127.0.0.1

Skopiuj adres IP uzyskany z tego kroku (A)

  • Uruchom aplikację zaplecza, do której możesz uzyskać dostęp z localhostlub 127.0.0.1z systemu.

  • Teraz w Android Studio możesz zastąpić adres URL, jeśli używasz kodu lub Możesz użyć adresu IP uzyskanego w kroku (A) i spróbować otworzyć w przeglądarce internetowej, tak jak to http://192.168.0.102:8080/

Nie zapomnij dodać PORT po adresie IP, w moim przypadku aplikacja działała na porcie 8080, więc dodałem adres IP uzyskany w (A) z portem 8080

Rozrzutny
źródło
0

localhost wydawał się działać poprawnie w moim emulatorze na początku, a potem zacząłem dostawać odmowę połączenia wyjątek użyłem 127.0.2.2 z przeglądarki emulatora i zadziałało, a kiedy użyłem tego w mojej aplikacji na Androida w emulatorze, znów zaczął pokazywać problem z odmową połączenia .

potem zrobiłem ifconfig i użyłem IP 192.168.2.2 i działało idealnie

użytkownik2368055
źródło
0

Złe żądanie oznacza ogólnie, że format wysyłanych danych jest nieprawidłowy. Może być niedopasowane mapowanie danych. Jeśli otrzymujesz złe żądanie, oznacza to, że możesz połączyć się z serwerem, ale żądanie nie zostało poprawnie wysłane.

karthik
źródło
0

Jeśli ktoś nadal tego szuka, tak to dla mnie działało.

Musisz znaleźć adres IP urządzenia w odniesieniu do podłączonego urządzenia / emulatora. W przypadku emulatorów należy wykonać następujące kroki;

  1. Przejdź do VM Virtual box -> wybierz podłączone urządzenie z listy.
  2. Wybierz Ustawienia -> Sieć-> Dowiedz się, do której sieci podłączone jest urządzenie. Dla mnie był to „VirtualBox Host-Only Ethernet Adapter # 2”.
  3. W virtualbox przejdź do Pliki-> Preferencje-> Sieć-> Sieci tylko hosta i znajdź IPv4 dla sieci określonej w powyższym kroku. (Po najechaniu myszką otrzymasz informacje)

Podaj ten adres IP, aby uzyskać dostęp do hosta lokalnego z emulatora. Port jest taki sam, jak podany podczas uruchamiania / publikowania usług.

Uwaga 1: Upewnij się, że zadbałeś o zapory ogniowe i reguły ruchu przychodzącego.

Uwaga 2: Sprawdź ten adres IP po ponownym uruchomieniu komputera. Z jakiegoś powodu, nawet jeśli podałem „Użyj następującego adresu IP”, adres IP hosta został zmieniony.

umiejętności
źródło
0

Dokładnie rozwiązałem problem, gdy warstwa usługi korzysta z programu Visual Studio IIS Express. Po prostu wskaż 10.0.2.2:port nie będzie działać. Zamiast bawić się w IIS Express, jak wspomniano w innych postach, po prostu umieściłem proxy przed IIS Express. Na przykład apache lub nginx. Będzie wyglądał plik nginx.conf

 # Mobile API
 server { 
    listen       8090;
    server_name  default_server;

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

Następnie Android musi wskazać mój adres IP 192.168.xx: 8090

Denis Wang
źródło
0

jeśli używasz jakiegoś pakietu innej firmy, takiego jak node express lub angular-cli, musisz znaleźć adres IP swojego komputera i dołączyć hosta do tego adresu IP w ramach konfiguracji uruchamiania serwera (zamiast localhost). Następnie uruchom go z emulatora za pomocą adresu IP. Na przykład musiałem użyć: ng serve -H 10.149.212.104do użycia kątowego-cli. Następnie z emulatora użyłem:http://10.149.212.104:4200

Helzgate
źródło
0

1) Uruchom polecenie ipconfig w cmd

2) Otrzymasz taki wynik wprowadź opis zdjęcia tutaj

3) Następnie użyj adresu IPv4 karty sieciowej VMWare 1, a następnie numeru portu

W moim przypadku jest to 8080, więc zamiast używać localhost: 8080

Używam 192.168.56.1:8080

wprowadź opis zdjęcia tutaj

Gotowe.....

Ameya Salagre
źródło
0

Wyjaśnienie, dlaczego localhostnie jest dostępne z emulatorów dla każdego, kto ma podstawowy problem z dostępem. W przypadku skomplikowanych przypadków przeczytaj inne odpowiedzi.

Problem: Emulator ma własną sieć lokalną i localhostodwzorowuje się na emulatorze , ale NIE na twoim hoście!

Rozwiązanie:

  1. Powiąż serwer, aby 0.0.0.0udostępnić go dla sieci emulatora
  2. Uzyskaj zewnętrzny adres IP swojego laptopa: ifconfigpolecenie dla komputerów Mac
  3. W Androidzie (lub aplikacji Flutter) użyj adresu IP zewnętrznego interfejsu, takiego jak: 192.168.1.10zamiastlocalhost
DenisKolodin
źródło
0

Miałem ten sam problem, gdy próbowałem połączyć się z moją usługą .NET Web Services IIS z emulatora Androida.

  1. zainstalować npm install -g iisexpress-proxy
  2. iisexpress-proxy 53990 to 9000 do ekspresowego portu proxy IIS do 9000 i dostępu do portu 9000 z emulatora podobnego "http://10.0.2.2:9000"

przyczyną wydaje się być domyślnie, IIS Express nie zezwala na połączenia z sieci https://forums.asp.net/t/2125232.aspx?Bad+Request+Invalid+Hostname+when+accessing+localhost+Web+API + lub + Web + App + od + przez + LAN

kakopappa
źródło