Доступ к 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. Таким образом, ваш веб-сервер может отлично работать на локальном хосте, а из вашего приложения для Android вы можете получить к нему доступ через " http://10.0.2.2:<hostport>".

Если ваш эмулятор должен иметь доступ к Интернету через прокси-сервер, вы можете настроить собственный HTTP-прокси с экрана расширенных элементов управления эмулятора. Открыв эмулятор, нажмите « Еще» точек , а затем « Настройки» и « Прокси» . Отсюда вы можете определить свои собственные настройки прокси HTTP. снимок экрана для конфигурации HTTP

Ахиль Джайн
источник
9
Зачем это? Ошибка Bad Request означает, что локальный сервер доступен, но запрос не совсем корректен.
Дедикат
я не уверен, я понимаю, что именно вы говорите, это имеет отношение к предоставленному решению ??
Ахил Джайн
Сейчас у меня не работает, но вот ссылка на документы по 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
Исмаил Явуз
19

Я столкнулся с той же проблемой при выполнении веб-приложения в IIS Express при выполнении Visual Studio. чтобы исправить это, вам нужно перейти в свойства вашего проекта, затем нажать на вкладку «Отладка» и изменить http: // localhost: [ВАШ ПОРТ] на http://127.0.0.1:[YOUR PORT] и установить URL-адрес андроида на http: / /10.0.2.2:[YOUR PORT]. это сработало для меня.

Эхсан Заргар Ершади
источник
1
это в сочетании с 10.0.0.2 url решило это для меня. казалось, что этот параметр переопределяет подход хостинга.json, описанный в другом месте.
user761574
1
Я использую сервер django локально в macOS и обычно я получаю к нему доступ как http://localhost:5000/в Postman, так и в симуляторе iOS. Это решение работает для симулятора Android и не требует ни изменения моего сервера, ни настроек симулятора. Быстро, красиво и переносимо на другие компьютеры без лишней работы.
Джон Пан
Android-приложение с веб-API xamarin и ASP.NET, использующими VS. РАБОТАЛ! Спасибо!!
Сохаиб Джавед
15

Если вы используете IIS Express, вам может потребоваться привязать все имена хостов, а не просто `localhost '. Проверьте этот хороший ответ:

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

Скажите IIS Express, чтобы он связывался со всеми IP-адресами и именами хостов. В своем файле .config (обычно% userprofile% \ My Documents \ IISExpress \ config \ applicationhost.config или $ (solutionDir) .vs \ config \ applicationhost.config для Visual Studio 2015) найдите элемент привязки вашего сайта и добавьте

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

Убедитесь, что вы добавили его в качестве второй привязки, а не модифицировали существующую, или VS просто повторно добавит новый сайт, к которому добавлено также. (1) Также может потребоваться запустить VS как администратор.

Хью Джеффнер
источник
Нет, вам не всегда нужно использовать пустое имя хоста, blog.lextudio.com/…
Лекс Ли,
<binding protocol = "http" bindingInformation = "*: 15000: 127.0.0.1" /> так понравилось IIS Express, когда 15000 был моим портом, а затем указывал на 10.0.2.2:15000 на эмуляторе Android
dpineda
11

Я решил это с помощью установки «Конвейер по Keyoti» в Visual Studio Professional 2015. Конвейер сгенерировал УДАЛЕННЫЙ адрес (ваш IP) с портом (45455), который разрешает внешний запрос. Пример:

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

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

Шаги в следующей ссылке:

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

Ронни Моран
источник
Что если вы не запускаете веб-сервер в Visual Studio? Имо, это не ответ на вопрос.
JAC
Я пытаюсь, но через несколько дней данный URL не работает и не находит никаких решений.
Имран Чоудхури
После долгой борьбы единственной вещью, которая сделала трюк, была установка этого расширения и включение функции удаленного URL. Требуется немного больше времени, чтобы поразить API, но это работает.
fabian278
9

У меня есть веб-сервер, работающий на моем локальном хосте.

Если я открою эмулятор и захочу подключиться к своему локальному хосту, который я использую 192.168.x.x. Это означает, что вы должны использовать свой локальный IP-адрес. Кстати, HttpResponseException (Bad Request)это не значит, что хост недоступен.

Некоторые другие ошибки приводят к этому исключению.

Marco
источник
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. Так что настраивайте свой веб-сервер на сервер, 127.0.0.1:54722а не на localhost:54722. Это должно сделать это.

Кобус Крюгер
источник
7

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

Затем получите свой IP-адрес от команды, откройте команду Windows и введите ipconfig введите описание изображения здесь

В моем случае IP был 192.168.10.33таким, чтобы мой URL был http://192.168.10.33:[port number] /. В Android студия использует этот URL в качестве вашего URL. И после этого установите свой URL и номер порта в ручном прокси для эмулятора.

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

Имран Чоудхури
источник
3

вам нужно установить URL как 10.0.2.2:portNr

portNr = указанный порт ASP.NET Development Server, на котором запущена моя текущая служба localhost:3229/Service.svc

так что мой URL 10.0.2.2:3229

я решил эту проблему таким образом

Я надеюсь, что это помогает...

lomec
источник
3

«BadRequest» - это ошибка, которая обычно отправляется самим сервером, см. Rfc 2616

10.4.1 400 неправильных запросов

Сервер не может понять запрос из-за неправильного синтаксиса. Клиент НЕ ДОЛЖЕН повторять запрос без изменений.

Таким образом, у вас есть рабочее соединение с сервером, но ваш запрос не соответствует форме эксперта. Я не знаю, как вы создаете соединение, какие заголовки включены (если они есть) - но это то, что вы должны проверить.

Если вам нужна дополнительная помощь, объясните, о чем ваш код и что он использует для подключения к серверу, чтобы мы получили общую картину.

Вот вопрос с той же проблемой - ответ состоял в том, что в заголовке не был задан тип содержимого.

Марвин Эмиль Брач
источник
Вы получили правильную точку, но потом пошли в неправильном направлении. Следующим шагом должен быть анализ сервера, чтобы выяснить, какие запросы он заботит, чтобы понять, почему на запросы эмуляторов отвечает 400. Пример использования IIS Express можно найти здесь, blog.lextudio.com/…
Лекс Ли
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 для внешних запросов без изменения конфигурации.
Джим В. говорит восстановить Монику
У вас есть другие варианты, blog.lextudio.com/… кроме запуска VS от имени администратора. Поэтому я не буду называть это необходимостью .
Лекс Ли
1

Для пользователей Laravel Homestead: если кто-то использует Laravel вместе с hometead, вы можете получить доступ к бэкенду приложения, используя 192.168.10.10 в эмуляторе.

Все еще не работает? Еще одним хорошим решением является использование ngrok https://ngrok.com/

Номи
источник
1

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

После нескольких часов копания я обнаружил, что если вы добавите аргумент -writable-system в команду запуска эмулятора, все будет работать.

Вы должны запустить эмулятор через командную строку, как показано ниже:

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

Затем в эмуляторе вы можете получить доступ к службе API, работающей на хост-компьютере, используя IP-адрес локальной сети и порт привязки:

http://192.168.1.2:<port>

Надеюсь, что это помогает вам.

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

winiex
источник
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из вашей системы.

  • Теперь в Android Studio вы можете заменить 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, и он работал отлично

user2368055
источник
0

Плохой запрос обычно означает, что формат отправляемых вами данных неверен. Может быть несоответствие отображения данных. Если вы получаете неверный запрос, это означает, что вы можете подключиться к серверу, но запрос отправляется неправильно.

Картик
источник
0

Если кто-то все еще ищет это, вот как это сработало для меня.

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

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

Укажите этот IP для доступа к локальному хосту из эмулятора. Порт такой же, какой вы указали при запуске / публикации ваших сервисов.

Примечание № 1: Убедитесь, что вы позаботились о брандмауэрах и правилах входящего трафика.

Примечание № 2: пожалуйста, проверьте этот IP после перезагрузки вашего компьютера. По какой-то причине, даже если я предоставил «Использовать следующий IP», IP-адрес только для хоста изменился.

skillworks
источник
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

Helzgate
источник
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 Webservice из эмулятора Android.

  1. устанавливать npm install -g iisexpress-proxy
  2. iisexpress-proxy 53990 to 9000 на прокси IIS Express порт до 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

kakopappa
источник