Mengakses localhost: port dari emulator Android


224

Saya menjalankan layanan web di mesin lokal saya yang beroperasi pada localhost:54722.

Saya ingin memanggil layanan dari aplikasi yang berjalan di emulator Android.

Saya membaca bahwa menggunakan 10.0.2.2dalam aplikasi akan mengakses localhost, tetapi sepertinya tidak bekerja dengan nomor port juga. Dikatakan HttpResponseException: Bad Request.



1
Saya mengharapkan perilaku, bahwa tidak semua port diteruskan ... 5555 tidak diteruskan tetapi 8080 dan 8081 bekerja dengan baik ...
Florian Loch

Anda perlu mengedit file konfigurasi vs-iis Anda: stackoverflow.com/a/50991257/7149454
Nick Kovalsky

Jawaban:


408

Anda dapat mengakses mesin host Anda dengan alamat IP " 10.0.2.2".

Ini telah dirancang dengan cara ini oleh tim Android. Jadi server web Anda dapat berjalan dengan sempurna di localhost dan dari aplikasi Android Anda, Anda dapat mengaksesnya melalui " http://10.0.2.2:<hostport>".

Jika emulator Anda harus mengakses internet melalui server proxy, Anda dapat mengonfigurasi proksi HTTP khusus dari layar Kontrol diperluas emulator. Dengan emulator terbuka, klik Lainnya titik-titik , lalu klik Pengaturan dan Proksi . Dari sini, Anda dapat menentukan pengaturan proxy HTTP Anda sendiri. tangkapan layar untuk konfigurasi HTTP


9
Kenapa harus begitu? Kesalahan Permintaan yang Buruk berarti bahwa server host lokal dapat dijangkau, tetapi permintaan tersebut tidak cukup benar ..
Dediqated

saya tidak yakin, saya menindaklanjuti, apa yang sebenarnya Anda katakan, apakah relevan dengan solusi yang diberikan ??
Akhil Jain

Tidak bekerja untuk saya sekarang, tapi di sini ada tautan ke dokumen Android dan jelas bahwa inilah yang harus dilakukan (10.0.2.2); developer.android.com/tools/devices/emulator.html
Stuart Hallows

23
jelas ini tidak menjelaskan apa-apa, Robin sudah menggunakan ip 10.0.2.2 dalam pertanyaan dan itu tidak berfungsi. Meskipun jawaban Anda benar, itu TIDAK memberikan solusi.
iversoncru

Saya juga mendapatkan 400: Kesalahan permintaan buruk dengan solusi yang sama.
Keval Patel

55

Gunakan 10.0.2.2 untuk AVD default dan 10.0.3.2 untuk Genymotion


4
Mengapa 10.0.3.2 untuk Genymotion?
Yakub

1
@ Jacob Karena Genymotion adalah emulator yang berbeda dan mereka memilih untuk menggunakan ip yang berbeda dari emulator google (Yang berbatasan dengan tidak berguna. Serius, kapan mereka akan melakukan sesuatu tentang emulator default yang mengerikan?)
computrius

Di API 28+ Anda harus mengizinkan trafik non-https (teks-jelas) secara eksplisit di konfigurasi jaringan Anda juga. Lihat jawaban saya di bawah stackoverflow.com/a/56769746/2290369
İsmail Yavuz

19

Saya menghadapi masalah yang sama pada Visual Studio menjalankan aplikasi web di IIS Express. untuk memperbaikinya Anda harus pergi ke properti proyek Anda kemudian klik pada Debug Tab dan ubah http: // localhost: [ PORT ANDA ] menjadi http://127.0.0.1:[YOUR PORT] dan atur url android ke http: / /10.0.2.2:[PORT ANDA ]. itu berhasil untuk saya.


1
ini bersamaan dengan url 10.0.0.2 menyelesaikannya untuk saya. pengaturan ini tampaknya mengesampingkan pendekatan hosting.json yang dijelaskan di tempat lain.
user761574

1
Saya menjalankan server django secara lokal di macOS dan biasanya saya mengaksesnya melalui http://localhost:5000/simulator Postman dan iOS. Solusi ini berfungsi untuk simulator Android dan tidak perlu memodifikasi server saya, atau pengaturan apa pun di simulator. Cepat, bagus, dan portabel untuk komputer lain tanpa kerja ekstra.
John Pang

Aplikasi Android dengan xamarin dan ASP.NET Web API menggunakan VS. BEKERJA! Terima kasih!!
sohaib menyentak

15

Jika Anda menggunakan IIS Express, Anda mungkin perlu mengikat semua nama host alih-alih hanya `localhost '. Periksa jawaban yang bagus ini:

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

Beri tahu IIS Express sendiri untuk mengikat ke semua alamat ip dan nama host. Dalam file .config Anda (biasanya% userprofile% \ My Documents \ IISExpress \ config \ applicationhost.config, atau $ (solutionDir) .vs \ config \ applicationhost.config untuk Visual Studio 2015), cari elemen pengikat situs Anda, dan tambahkan

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

Pastikan untuk menambahkannya sebagai penjilidan kedua alih-alih memodifikasi yang sudah ada atau VS hanya akan menambahkan kembali situs baru yang ditambahkan dengan (1) Juga, Anda mungkin perlu menjalankan VS sebagai administrator.


Tidak, Anda tidak selalu perlu menggunakan nama host kosong, blog.lextudio.com/...
Lex Li

<binding protocol = "http" bindingInformation = "*: 15000: 127.0.0.1" /> ini adalah cara yang disukai IIS Express di mana 15000 adalah port saya dan kemudian menunjuk ke 10.0.2.2:15000 pada emulator android
dpineda

11

Saya menyelesaikannya dengan pemasangan "Conveyor by Keyoti" di Visual Studio Professional 2015. Conveyor menghasilkan alamat REMOTE (IP Anda) dengan port (45455) yang memungkinkan permintaan eksternal. Contoh:

masukkan deskripsi gambar di sini

Conveyor memungkinkan Anda menguji aplikasi web dari tablet eksternal dan ponsel di jaringan Anda atau dari emulator Android (tanpa http://10.0.2.2:<hostport>)

Langkah-langkahnya ada di tautan berikut:

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


Bagaimana jika Anda tidak menjalankan server web di dalam Visual Studio? Imo, ini bukan jawaban untuk pertanyaan itu.
Jac

Saya mencoba tetapi setelah beberapa hari kemudian URL yang diberikan tidak berfungsi dan tidak menemukan solusi.
Md Imran Choudhury

Setelah perjuangan panjang, satu-satunya hal yang berhasil adalah menginstal ekstensi ini dan mengaktifkan fitur Remote URL. Dibutuhkan permintaan sedikit lebih lama untuk mencapai API, tetapi berhasil.
fabian278

9

Saya memiliki server web yang berjalan di localhost saya.

Jika saya membuka emulator dan ingin terhubung ke localhost saya, saya menggunakan 192.168.x.x. Ini berarti Anda harus menggunakan alamat IP lokal Anda. Omong-omong, Anda HttpResponseException (Bad Request)tidak berarti bahwa tuan rumah tidak dapat dijangkau.

Beberapa kesalahan lain menyebabkan pengecualian ini.


9

Karena 10.0.2.2bukan domain aman untuk Android, Anda harus mengizinkan domain tidak aman dalam konfigurasi jaringan Anda untuk API 28+ di mana koneksi non-TLS dicegah secara default.

Anda dapat menggunakan konfigurasi saya berikut ini:

Buat file baru di main / res / xml / network_security_config.xml sebagai:

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

Dan arahkan ke AndroidManifest.xml

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

8

Masalahnya adalah bahwa emulator Android memetakan 10.0.2.2ke 127.0.0.1, bukan ke localhost. Jadi konfigurasikan server web Anda ke serveron 127.0.0.1:54722dan bukan localhost:54722. Itu harus dilakukan.


7

Setelah menjalankan host lokal Anda, Anda sampai di http://localhost:[port number]/sini Anda menemukan nomor port Anda.

Kemudian dapatkan alamat IP Anda dari Command, Buka perintah windows Anda dan ketik ipconfig masukkan deskripsi gambar di sini

Dalam kasus saya, IP sudah 192.168.10.33jadi URL saya akan menjadi http://192.168.10.33:[port nomor] /. Di Android, studio menggunakan URL ini sebagai URL Anda. Dan setelah itu atur URL Anda dan nomor port Anda di proksi manual untuk emulator.

masukkan deskripsi gambar di sini


3

Anda perlu mengatur URL sebagai 10.0.2.2:portNr

portNr = port yang diberikan oleh ASP.NET Development Server layanan saya saat ini sedang berjalan localhost:3229/Service.svc

jadi url saya 10.0.2.2:3229

Saya telah memperbaiki masalah saya dengan cara ini

Saya harap ini membantu ...


3

"BadRequest" adalah kesalahan yang biasanya dikirim oleh server itu sendiri, lihat rfc 2616

10.4.1 400 Permintaan Buruk

Permintaan tidak dapat dipahami oleh server karena sintaksis yang salah. Klien TIDAK HARUS mengulangi permintaan tanpa modifikasi.

Jadi Anda mendapat koneksi yang berfungsi ke server, tetapi permintaan Anda tidak sesuai dengan formulir expecet. Saya tidak tahu bagaimana Anda membuat koneksi, tajuk apa yang disertakan (jika ada) - tetapi itulah yang harus Anda periksa.

Jika Anda membutuhkan bantuan lebih lanjut, jelaskan tentang kode Anda dan apa yang digunakannya untuk terhubung ke Server, jadi kami memiliki gambaran besarnya.

Berikut adalah pertanyaan dengan Masalah yang sama - jawabannya adalah bahwa tipe konten tidak diatur dalam header.


Anda mendapat poin yang benar, tetapi pergi ke arah yang salah sesudahnya. Langkah selanjutnya adalah menganalisis server untuk mempelajari jenis permintaan apa yang dipedulikannya, sehingga untuk memahami mengapa permintaan dari emulator dijawab dengan 400. Studi kasus untuk IIS Express dapat ditemukan di sini, blog.lextudio.com/...
Lex Li

1

Saya ingin menunjukkan kepada Anda cara saya mengakses API Web IISExpress dari Android Emulator saya. Saya menggunakan Visual Studio 2015. Dan saya memanggil Android Emulator dari Android Studio.

Semua yang perlu saya lakukan adalah menambahkan baris berikut ke konfigurasi pengikatan di file applicationhost.config saya

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

Kemudian saya memeriksa dan menggunakan Alamat IP4 untuk mengakses API saya dari emulator Android

Persyaratan: Anda harus menjalankan Visual Studio sebagai Administrator. Posting ini memberikan cara sempurna untuk melakukan ini.

Untuk lebih jelasnya, silakan kunjungi posting saya di github

Semoga ini membantu.


2
Atau instal VS Extension gratis bernama Conveyor dari jendela Extensions. Itu membuka IIS Express untuk permintaan luar tanpa mengubah konfigurasi.
Jim W mengatakan mengembalikan Monica

Anda memiliki opsi lain, blog.lextudio.com/... daripada menjalankan VS sebagai admin. Jadi saya tidak akan menyebut itu suatu keharusan .
Lex Li

1

Untuk Pengguna Homestead Laravel: Jika ada yang menggunakan Laravel dengan homestead Anda dapat mengakses backend aplikasi menggunakan 192.168.10.10 di emulator

Masih tidak bekerja? Solusi bagus lainnya adalah menggunakan ngrok https://ngrok.com/


1

Saya menggunakan Windows 10 sebagai platform pengembangan saya, mengakses 10.0.2.2:port di emulator saya tidak berfungsi seperti yang diharapkan, dan hasil yang sama untuk solusi lain dalam pertanyaan ini juga.

Setelah beberapa jam menggali, saya menemukan bahwa jika Anda menambahkan argumen -writable-system ke perintah startup emulator, semuanya akan berfungsi.

Anda harus memulai emulator melalui baris perintah seperti di bawah ini:

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

Kemudian di emulator Anda, Anda dapat mengakses layanan API Anda yang berjalan di mesin host, menggunakan alamat IP LAN dan port yang mengikat:

http://192.168.1.2:<port>

Semoga ini bisa membantu Anda.

Tentang memulai emulator dari baris perintah: https://developer.android.com/studio/run/emulator-commandline .


1

Untuk mengakses localhost di Android Emulator

  • Tambahkan izin internet dari AndroidManifest.xml
    <uses-permission android:name="android.permission.INTERNET" />

  • Tambahkan android:usesCleartextTraffic="true", lebih detail di sini :

  • Jalankan perintah yang disebutkan di bawah ini untuk menemukan alamat IP sistem Anda:

ifconfig | grep "inet " | grep -v 127.0.0.1

Salin alamat IP yang diperoleh dari langkah ini (A)

  • Jalankan aplikasi backend Anda, yang dapat Anda akses di localhostatau 127.0.0.1dari sistem Anda.

  • Sekarang di studio android, Anda dapat mengganti URL jika Anda menggunakan kode atau Anda dapat menggunakan alamat ip yang diperoleh dari langkah (A) dan mencoba membuka di browser web, Seperti ini http://192.168.0.102:8080/

Jangan lupa untuk menambahkan PORT setelah alamat IP, dalam aplikasi kasus saya berjalan pada port 8080 jadi saya menambahkan IP yang diperoleh di (A) dengan port 8080


0

localhost tampaknya berfungsi dengan baik di emulator saya di awal dan kemudian saya mulai mendapatkan koneksi yang ditolak kecuali saya menggunakan 127.0.2.2 dari browser emulator dan itu bekerja dan ketika saya menggunakan ini di aplikasi android saya di emulator itu lagi mulai menunjukkan koneksi menolak masalah .

kemudian saya melakukan ifconfig dan saya menggunakan ip 192.168.2.2 dan bekerja dengan baik


0

Permintaan yang buruk umumnya berarti format data yang Anda kirim salah. Mungkin pemetaan data tidak cocok. Jika Anda mendapatkan permintaan yang buruk berarti Anda dapat terhubung ke server, tetapi permintaan tersebut tidak terkirim dengan benar.


0

Jika ada yang masih mencari ini, ini adalah cara kerjanya untuk saya.

Anda perlu menemukan IP mesin Anda sehubungan dengan perangkat / emulator yang Anda sambungkan. Untuk Emulator, jalannya adalah dengan mengikuti langkah-langkah di bawah ini;

  1. Pergi ke kotak Virtual VM -> pilih perangkat yang terhubung dalam daftar.
  2. Pilih Pengaturan -> Jaringan-> Cari tahu ke jaringan mana perangkat dilampirkan. Bagi saya itu adalah 'VirtualBox Host-Only Ethernet Adapter # 2'.
  3. Di virtualbox, buka Files-> Preferences-> Network-> Host-Only Networks, dan cari tahu IPv4 untuk jaringan yang ditentukan pada langkah di atas. (Dengan Melayang Anda akan mendapatkan info)

Berikan IP ini untuk mengakses localhost dari emulator. Port sama dengan yang Anda berikan saat menjalankan / menerbitkan layanan Anda.

Catatan # 1: Pastikan Anda telah menjaga firewall dan aturan masuk.

Catatan # 2: Silakan periksa IP ini setelah Anda me-restart mesin Anda. Untuk beberapa alasan, bahkan jika saya memberikan "Gunakan IP berikut" IP Host-Only dapat berubah.


0

Saya telah menyelesaikan masalah saat lapisan layanan menggunakan Visual Studio IIS Express. Arahkan ke 10.0.2.2:port tidak akan berfungsi. Alih-alih mengotak-atik IIS Express seperti yang disebutkan oleh posting lain, saya hanya meletakkan proxy di depan IIS Express. Misalnya, apache atau nginx. Nginx.conf akan terlihat seperti

 # Mobile API
 server { 
    listen       8090;
    server_name  default_server;

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

Maka android perlu menunjuk ke alamat IP saya sebagai 192.168.xx: 8090


0

jika Anda menggunakan beberapa paket pihak ke-3 seperti node express atau angular-cli, Anda harus menemukan IP mesin Anda, dan melampirkan host Anda ke IP tersebut dalam konfigurasi startup server (bukan localhost). Kemudian luncurkan dari emulator menggunakan IP. Sebagai contoh, saya harus menggunakan: ng serve -H 10.149.212.104untuk menggunakan angular-cli. Kemudian dari emulator saya menggunakan:http://10.149.212.104:4200


0

1) Jalankan perintah ipconfig dalam cmd

2) Anda akan mendapatkan hasil seperti ini masukkan deskripsi gambar di sini

3) Kemudian gunakan Alamat IPv4 dari VMWare Network Adapter 1 diikuti oleh nomor port

Dalam Kasus Saya ini 8080, jadi alih-alih menggunakan localhost: 8080

Saya menggunakan 192.168.56.1:8080

masukkan deskripsi gambar di sini

Selesai .....


0

Penjelasan mengapa localhosttidak tersedia dari emulator untuk siapa saja yang memiliki masalah akses dasar. Untuk kasus canggih baca jawaban lain.

Masalah: Emulator memiliki jaringan lokal sendiri dan localhostmemetakan dirinya ke emulator , tetapi BUKAN host Anda!

Larutan:

  1. Ikat server Anda 0.0.0.0untuk membuatnya tersedia untuk jaringan emulator
  2. Dapatkan alamat IP eksternal laptop Anda: ifconfigperintah untuk Mac
  3. Di Android (atau aplikasi Flutter) gunakan alamat IP dari antarmuka eksternal Anda seperti: 192.168.1.10bukanlocalhost

0

Saya memiliki masalah yang sama ketika saya mencoba untuk terhubung ke IIS .NET Webservice dari emulator Android.

  1. Install npm install -g iisexpress-proxy
  2. iisexpress-proxy 53990 to 9000 ke proxy IIS express port ke 9000 dan akses port 9000 dari emulator like "http://10.0.2.2:9000"

alasannya tampaknya secara default, IIS Express tidak mengizinkan koneksi dari jaringan https://forums.asp.net/t/2125232.aspx?Bad+Request+Invalid+Hostname+when+accessing+localhost+Web+API + atau + Web + Aplikasi + dari + lintas + LAN

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.