Доступ к localhost: порт из эмулятора Android

Я использую веб-сервис на моей локальной машине, который работает на localhost:54722,

Я хочу вызвать сервис из приложения, запущенного в эмуляторе Android.

Я прочитал это, используя 10.0.2.2 в приложении будет доступ к localhost, но, похоже, он не работает с номером порта. Это говорит HttpResponseException: Bad Request,

27 ответов

Однако существует гораздо лучшее решение. Вы можете получить доступ к хост-машине с IP-адресом "10.0.2.2".

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

Используйте 10.0.2.2 для AVD по умолчанию и 10.0.3.2 для Genymotion

Поскольку 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">

Я не уверен, что это решение будет работать для каждого эмулятора Android и каждой версии Android SDK, но выполнение следующего помогло мне.

adb reverse tcp:54722 tcp:54722

Вам нужно будет запустить свой эмулятор, и тогда вы сможете нажать localhost:54722 внутри работающего эмулятора устройства.

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

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

/questions/5905592/kak-vklyuchit-vneshnij-zapros-v-iis-express/5905615#5905615

Скажите 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 от имени администратора.

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

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

Шаги находятся по следующей ссылке:

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

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

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

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

Проблема в том, что карты эмулятора Android 10.0.2.2 в 127.0.0.1не localhost, Так что настройте свой веб-сервер на serveron 127.0.0.1:54722 и не localhost:54722, Это должно сделать это.

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

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

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

Чтобы получить доступ к localhost в эмуляторе Android

  • Добавьте интернет-разрешение из 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 вы можете заменить URL-адрес, если вы используете код, или вы можете использовать IP-адрес, полученный на шаге (A), и попробовать открыть его в веб-браузере, например http://192.168.0.102:8080/

Не забудьте добавить ПОРТ после IP-адреса, в моем случае приложение работало на порту 8080, поэтому я добавил IP, полученный в (A), с портом 8080

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

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

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

я исправил свою проблему таким образом

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

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

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

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

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

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

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

У меня была такая же проблема, когда я пытался подключиться к своему веб-сервису IIS .NET из эмулятора 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+or+Web+App+from+across+LAN

Объяснение почему localhostнедоступен из эмуляторов для тех, у кого есть проблемы с доступом. Для сложных случаев прочтите другие ответы.

Проблема: у эмулятора есть собственная локальная сеть иlocalhostсопоставляется с эмулятором, но НЕ с вашим хостом!

Решение:

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

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

2) Вы получите такой результат

3) Затем используйте IPv4-адрес сетевого адаптера 1 VMWare, а затем номер порта.

В моем случае это 8080, поэтому вместо localhost:8080

Я использую 192.168.56.1:8080

Готово.....

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

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

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

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

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

http://192.168.1.2:<port>

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

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

Что мне помогло, так это сделать две вещи:

  1. Отключите перенаправление на https. Когда я пытаюсь получить доступ к http-порту с локального хоста, по умолчанию он перенаправляется на https. Отключите его, удалив конфигурацию https для локальной системы или отключив перенаправление для вашей ОС.
  2. Отключите брандмауэр. В настоящее время существуют разные уровни настроек брандмауэра. Проверьте, можете ли вы уточнить порты или приложения, которые можно обойти брандмауэром.

Я хотел бы показать вам способ доступа к веб-API IISExpress из моего эмулятора Android. Я использую Visual Studio 2015. И я вызываю эмулятор Android из Android Studio.

Все, что мне нужно сделать, это добавить следующую строку в конфигурацию привязки в моем файле applicationhost.config

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

Затем я проверяю и использую IP4-адрес для доступа к своему API из эмулятора Android.

Требование: вы должны запустить Visual Studio от имени администратора. Этот пост дает идеальный способ сделать это.

Для более подробной информации, пожалуйста, посетите мой пост на GitHub

Надеюсь это поможет.

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

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

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

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

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

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

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

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

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

localhost, кажется, работал нормально в моем эмуляторе при запуске, а затем я начал получать исключение для соединения, я использовал 127.0.2.2 из браузера эмулятора, и это работало, и когда я использовал это в моем приложении для Android в эмуляторе, он снова начал показывать проблему отказа в соединении,

тогда я сделал ifconfig и я использовал IP 192.168.2.2, и он работал отлично

Я точно решил проблему, когда сервисный уровень использует 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

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

Если вы работаете с Asp.Net Web API, в папке .vs / config внутри вашего проекта измените эти строки в соответствии с настройками вашего порта. Предположим, вы используете порт 1234 и физический путь к папке проекта, заданной IIS, - «D: \ My Projects \ YourSiteName», затем

      <site name="YourSiteName" id="1">
                <application path="/" applicationPool="Clr4IntegratedAppPool">
                    <virtualDirectory path="/" physicalPath="D:\My Projects\YourSiteName" />
                </application>
                <bindings>
                    <binding protocol="http" bindingInformation="*:1234:*" />
                </bindings>
            </site>

В студии Android войдите в свой api с помощью http://10.0.2.2:1234 ...

Укажите IP-адрес вашей системы, имеющей интернет в URL. например: 190.168.1.90 у меня работает

Другие вопросы по тегам