Доступ до localhost: порт від емулятора Android


224

Я запускаю веб-службу на своїй локальній машині, на якій працює localhost:54722 .

Я хочу зателефонувати в службу через додаток, що працює в емуляторі Android.

Я читав, що за 10.0.2.2допомогою програми можна отримати доступ до localhost, але, схоже, це також не працює з номером порту. Це говорить HttpResponseException: Bad Request.



1
Я очікував поведінки, що не всі порти пересилаються ... 5555 не пересилається, але 8080 і 8081 працювали чудово ...
Флоріан Лох

Вам потрібно відредагувати конфігураційний файл vs-iis: stackoverflow.com/a/50991257/7149454
Нік Ковальський

Відповіді:


408

Ви можете отримати доступ до свого хост-машини з IP-адресою " 10.0.2.2".

Це було розроблено таким чином командою Android. Таким чином, ваш веб-сервер може чудово працювати в localhost, і через додаток для Android ви можете отримати доступ до нього через " http://10.0.2.2:<hostport>".

Якщо ваш емулятор повинен отримати доступ до Інтернету через проксі-сервер, ви можете налаштувати спеціальний проксі HTTP на екрані Розширені елементи керування емулятора. Коли відкриється емулятор, натисніть Більше крапки , а потім натисніть Налаштування та Проксі . Звідси ви можете визначити власні налаштування HTTP-проксі. знімок екрана для конфігурації HTTP


9
Навіщо це робити? Помилка Bad Request означає, що сервер localhost доступний, але запит не зовсім коректний ..
Dediqated

я не впевнений, я переглядаю, що саме ви говорите, чи це стосується наданого рішення ??
Ахіл Джайн

Зараз у мене не працює, але ось посилання на документи Android і зрозуміло, що саме це може зробити (10.0.2.2); developer.android.com/tools/devices/emulator.html
Стюарт Хеллоуз

23
очевидно, це нічого не пояснює, Робін вже використовує 10.0.2.2 ip у питанні, і він не працює. Хоча ваша відповідь правильна, вона НЕ забезпечує рішення.
iversoncru

Я теж отримую 400: Помилка помилкового запиту з тим же рішенням.
Кеваль Патель

55

Використовуйте 10.0.2.2 для AVD за замовчуванням та 10.0.3.2 для Genymotion


4
Чому 10.0.3.2 для Genymotion?
Яків

1
@Jacob Тому що Genymotion - це інший емулятор, і вони вирішили використовувати інший ip, ніж емулятор google (який межує з марним. Серйозно, коли вони збираються зробити щось щодо свого жахливого емулятора за замовчуванням?)
computrius

В API 28+ ви також повинні чітко дозволити трафік без https (чіткого тексту) у вашій мережевій конфігурації. Дивіться мою відповідь нижче stackoverflow.com/a/56769746/2290369
İsmail Yavuz

19

Я зіткнувся з тією ж проблемою на Visual Studio, що виконує веб-додаток на IIS Express. Щоб виправити це, вам потрібно перейти до властивостей проекту, потім натиснути на вкладку налагодження та змінити http: // localhost: [YOUR PORT] на http://127.0.0.1: evidenceYOUR PORT] та встановити URL-адресу для android на http: / /10.0.2.2: evidenceYOUR PORT]. це працювало на мене.


1
це спільно з 10.0.0.2 URL вирішило це для мене. ця настройка, здавалося, переважає підхід hosting.json, пояснений в інших місцях.
користувач761574

1
Я запускаю сервер django локально на macOS, і зазвичай я отримую доступ до нього через http://localhost:5000/симулятор Postman та iOS. Це рішення працює для симулятора Android, і не потрібно змінювати мій сервер, ані будь-яких налаштувань симулятора. Швидкий, приємний та портативний на інших комп’ютерах без зайвої роботи.
Джон Панг

Додаток Android із веб-API xamarin та ASP.NET, які використовують VS. РОБОТИ! Дякую!!
sohaib javed

15

Якщо ви використовуєте IIS Express, можливо, вам знадобиться прив’язати до всіх імен хостів замість просто "localhost". Перевірте цю тонку відповідь:

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

Скажіть IIS Express себе прив’язувати до всіх ip-адрес та імен хостів. У файлі .config (як правило,% userprofile% \ Мої документи \ IISExpress \ config \ applicationhost.config або $ (solutionDir) .vs \ config \ applicationhost.config для Visual Studio 2015) знайдіть прив’язний елемент вашого веб-сайту та додайте

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

Не забудьте додати його як друге прив'язку замість зміни існуючого, або VS просто повторно додасть новий сайт, доданий із (1) також. Можливо, вам доведеться запустити VS як адміністратор.


Ні, вам не завжди потрібно використовувати порожнє ім’я хоста, blog.lextudio.com/…
Lex Li

<протокол прив'язки = "http "indingInformation =" *: 15000: 127.0.0.1 "/> це було так, як IIS Express сподобався, де 15000 мій порт, а потім вказує на 10.0.2.2:15000 на андроїд-емуляторі
dpineda

11

Я вирішив це, встановивши "Конвеєр від Keyoti" у Visual Studio Professional 2015. Конвеєр генерує REMOTE-адресу (ваш IP) з портом (45455), який дозволяє зовнішній запит. Приклад:

введіть тут опис зображення

Конвеєр дозволяє перевіряти веб-програми із зовнішніх планшетів та телефонів у вашій мережі або з емуляторів Android (без них) http://10.0.2.2:<hostport> )

Етапи перебувають за наступним посиланням:

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


Що робити, якщо не запустити веб-сервер у Visual Studio? Імо, це не відповідь на питання.
jAC

Я намагаюся, але через кілька днів вказана URL-адреса не працює і не знайшла жодного рішення.
Md Imran Choudhury

Після тривалої боротьби єдиним, що зробив трюк, було встановлення цього розширення та включення функції віддаленої URL-адреси. Щоб запустити API, потрібен запит трохи довше, але він працює.
fabian278

9

У мене на локальному хості працює веб-сервер.

Якщо я відкрию емулятор і хочу підключитися до мого localhost, яким я користуюся 192.168.x.x. Це означає, що вам слід скористатись локальною lan ip адресою. До речі, вашHttpResponseException (Bad Request) не означає, що хост недоступний.

Деякі інші помилки призводять до цього винятку.


9

З тих пір 10.0.2.2 це не захищений домен для Android, ви повинні дозволити незахищені домени у вашій мережевій конфігурації для API 28+, де підключення, що не належать до TLS, за замовчуванням перешкоджають.

Ви можете використовувати мої наступні конфігурації:

Створіть новий файл у main / res / xml / network_security_config.xml як:

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

І вкажіть його в AndroidManifest.xml

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

8

Проблема полягає в тому, що Android емулятор карти 10.0.2.2з 127.0.0.1, НЕ в localhost. Тож налаштуйте свій веб-сервер на serveron, 127.0.0.1:54722а не localhost:54722. Це повинно це робити.


7

Після запуску місцевого хоста ви потрапляєте http://localhost:[port number]/сюди, ви знайшли номер свого порту.

Потім отримайте свою IP-адресу від Command, Відкрийте команду Windows та введіть ipconfig введіть тут опис зображення

У моєму випадку IP був 192.168.10.33таким, що моя URL-адреса буде http://192.168.10.33: evidenceport номер] /. В Android студія використовує цю URL-адресу як вашу URL-адресу. Після цього встановіть свою URL-адресу та номер порту в ручному проксі для емулятора.

введіть тут опис зображення


3

вам потрібно встановити URL як 10.0.2.2:portNr

portNr = даний порт від ASP.NET Server Development, на якому працює моя поточна служба localhost:3229/Service.svc

тому моя URL-адреса 10.0.2.2:3229

Я би вирішив свою проблему таким чином

я сподіваюся, що це допомагає ...


3

"BadRequest" - це помилка, яку зазвичай надсилає сам сервер, див. Rfc 2616

10.4.1 400 Поганий запит

Сервер не міг зрозуміти запит через неправильний синтаксис. Клієнт НЕ повинен повторювати запит без змін.

Таким чином, у вас є робоче з'єднання з сервером, але ваш запит не відповідає формі очікування. Я не знаю, як ви створюєте з'єднання, які заголовки включені (якщо такі є) - але це те, що ви повинні перевірити.

Якщо вам потрібна додаткова допомога, поясніть, про що йдеться у вашому коді та що він використовує для підключення до Сервера, так що ми маємо велику картину.

Ось питання з тією ж проблемою - відповідь полягала в тому, що тип вмісту не був встановлений у заголовку.


Ви отримали правильну точку, але пішли в неправильному напрямку згодом. Наступним кроком повинен бути аналіз сервера, щоб дізнатися, які саме запити його цікавлять, щоб зрозуміти, чому на запити емуляторів відповідають 400. Приклад дослідження для IIS Express можна знайти тут, blog.lextudio.com/…
Lex Li

1

Я хотів би показати вам, як я отримую доступ до веб-API IISExpress зі свого емулятора Android. Я використовую Visual Studio 2015. І дзвоню Android-емулятор з Android Studio.

Все, що мені потрібно зробити, - це додати наступний рядок до конфігурації прив'язки у моєму файлі applicationhost.config

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

Потім я перевіряю і використовую IP4-адресу для доступу до мого API від емулятора Android

Вимога: ви повинні запустити Visual Studio як адміністратор. Цей пост дає ідеальний спосіб зробити це.

Для отримання більш детальної інформації, будь ласка, відвідайте моє повідомлення на github

Сподіваюсь, це допомагає.


2
Або встановіть безкоштовне розширення VS під назвою Conveyor у вікні розширень. Це відкриває IIS Express для зовнішніх запитів без зміни конфігурації.
Джим W каже, що поверніть Моніку

У вас є інші параметри, blog.lextudio.com/…, ніж запуск VS в якості адміністратора. Тому я не буду називати це обов'язковим .
Лекс Лі

1

Для користувачів Laravel Homestead: Якщо хтось із Laravel використовує садибу, ви можете отримати доступ до додатка програми за допомогою 192.168.10.10 в емуляторі

Ще не працює? Ще одне вдале рішення - використовувати ngrok https://ngrok.com/


1

Я використовую Windows 10 як свою платформу розробки, доступ до 10.0.2.2:port в моєму емуляторі працює не так, як очікувалося, і такий же результат для інших рішень у цьому питанні.

Після кількох годин копання я виявив, що якщо ви додасте -write-system аргумент до команди запуску емулятора, все просто працюватиме.

Потрібно запустити емулятор за допомогою командного рядка, як показано нижче:

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

Потім у своєму емуляторі ви можете отримати доступ до своєї послуги API, що працює на хост-машині, використовуючи локальну IP-адресу та порт прив’язки:

http://192.168.1.2:<port>

Сподіваюсь, це допоможе вам вийти.

Про запуску емулятора з командного рядка: https://developer.android.com/studio/run/emulator-commandline .


1

Щоб отримати доступ до localhost на Android Emulator

  • Додайте Інтернет-дозвіл від AndroidManifest.xml
    <uses-permission android:name="android.permission.INTERNET" />

  • Додайте android:usesCleartextTraffic="true"більше деталей тут :

  • Виконайте вказану нижче команду, щоб знайти IP-адресу системи:

ifconfig | grep "inet " | grep -v 127.0.0.1

Скопіюйте IP-адресу, отриману на цьому кроці (A)

  • Запустіть додаток, до якого ви можете отримати доступ у localhostабо 127.0.0.1зі своєї системи.

  • Тепер в андроїд-студії ви можете замінити URL-адресу, якщо ви використовуєте код або Ви можете скористатися ip-адресою, отриманою на етапі (A), і спробувати відкрити веб-браузер, як це http://192.168.0.102:8080/

Не забудьте додати PORT після IP-адреси, у моєму випадку додаток працює на порту 8080, тому я додав IP, отриманий у (A), з портом 8080


0

localhost, здавалося, працює добре в моєму емуляторі на початку, і тоді я почав отримувати з'єднання відмовився від виключення, я використав 127.0.2.2 з браузера емулятора, і він працював, і коли я використав це в моєму додатку для Android в емуляторі, він знову почав показувати, що підключення відмовилося від проблеми .

тоді я зробив ifconfig, і я використав ip 192.168.2.2, і він працював ідеально


0

Неправильний запит, як правило, означає, що формат даних, які ви надсилаєте, неправильний. Можливо невідповідність відображення даних. Якщо ви отримуєте поганий запит, це означає, що ви можете підключитися до сервера, але запит не надсилається належним чином.


0

Якщо хтось все ще шукає цього, це так працювало для мене.

Вам потрібно знайти IP вашого пристрою стосовно пристрою / емулятора, до якого ви підключені. Для емуляторів в дорозі, виконуючи наступні кроки;

  1. Перейдіть до віртуального вікна VM -> виберіть підключений пристрій у списку.
  2. Виберіть Налаштування -> Мережа-> Дізнайтеся, до якої мережі приєднано пристрій. Для мене це був «VirtualBox Host-Only Ethernet Adapter №2».
  3. У віртуальній скриньці перейдіть до Файли-> Налаштування-> Мережа-> Мережі, що приймаються лише для хостів, і знайдіть IPv4 для мережі, вказаної в кроці вище. (Наведення курсора ви отримаєте інформацію)

Надайте цей IP для доступу до localhost з емулятора. Порт такий же, як ви надали під час запуску / публікації своїх послуг.

Примітка №1. Переконайтеся, що ви подбали про брандмауери та правила входу.

Примітка №2. Перевірте цей IP після перезавантаження машини. Чомусь навіть якщо я надав "Використовувати наступний IP", IP-адреса, що приймає лише хост, була змінена.


0

Я вирішив точну проблему, коли сервісний рівень використовує Visual Studio IIS Express. Просто вкажіть на 10.0.2.2:port звичайну роботу. Замість того, щоб возитися навколо IIS Express, як згадували інші пости, я просто поставив проксі перед IIS Express. Наприклад, apache або nginx. Вигляд nginx.conf виглядатиме так

 # Mobile API
 server { 
    listen       8090;
    server_name  default_server;

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

Тоді андроїд повинен вказувати на мою IP-адресу як 192.168.xx: 8090


0

якщо ви використовуєте якийсь сторонній пакет, наприклад, node express або angular-cli, вам потрібно буде знайти IP вашого пристрою та приєднати свій хост до цього IP в налаштуваннях запуску сервера (замість localhost). Потім запустіть його з емулятора за допомогою IP. Наприклад, мені довелося користуватися: ng serve -H 10.149.212.104використовувати angular-cli. Потім з емулятора я використав:http://10.149.212.104:4200


0

1) Запустіть команду ipconfig в cmd

2) Ви отримаєте такий результат введіть тут опис зображення

3) Потім використовуйте IPv4-адресу мережевого адаптера 1 VMWare, а потім номер порту

У моєму випадку його 8080, тому замість використання localhost: 8080

Я використовую 192.168.56.1:8080

введіть тут опис зображення

Готово .....


0

Пояснення, чому localhostнедоступний з емуляторів для всіх, хто має основну проблему доступу. Для складних випадків читайте інші відповіді.

Проблема: Емулятор має власну локальну мережу і localhostвідображає себе в емуляторі , але НЕ ваш хост!

Рішення:

  1. Прив’яжіть ваш сервер, щоб 0.0.0.0він став доступним для мережі емулятора
  2. Отримайте зовнішню IP-адресу свого ноутбука: ifconfigкоманда для Mac
  3. В Android (або додатку Flutter) використовуйте IP-адресу вашого зовнішнього інтерфейсу, наприклад: 192.168.1.10замість:localhost

0

У мене була така ж проблема, коли я намагався підключитися до свого веб-сервісу IIS .NET від емулятора Android.

  1. встановити npm install -g iisexpress-proxy
  2. iisexpress-proxy 53990 to 9000 до проксі-експрес-порту IIS до 9000 та до порту доступу 9000 від емулятора, як "http://10.0.2.2:9000"

причина, здається, за замовчуванням, IIS Express не дозволяє підключення до мережі https://forums.asp.net/t/2125232.aspx?Bad+Request+Invalid+Hostname+when+accessing+localhost+Web+API + або + Web + App + від + через + LAN

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.