Доступ к 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)это не значит, что хост недоступен.

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


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

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

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


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 .


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, и он работал отлично


0

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


0

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

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

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

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

Примечание № 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 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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.