Acceso a localhost: puerto desde el emulador de Android


224

Estoy ejecutando un servicio web en mi máquina local que se ejecuta en localhost:54722.

Quiero llamar al servicio desde una aplicación que se ejecuta en el emulador de Android.

Leí que usar 10.0.2.2en la aplicación accedería a localhost, pero no parece funcionar también con el número de puerto. Dice HttpResponseException: Bad Request.



1
Esperaba el comportamiento, que no se reenvían todos los puertos ... 5555 no se reenvió, pero 8080 y 8081 funcionaron bien ...
Florian Loch

Necesita editar su archivo de configuración de vs-iis: stackoverflow.com/a/50991257/7149454
Nick Kovalsky

Respuestas:


408

Puede acceder a su máquina host con la dirección IP " 10.0.2.2".

Esto ha sido diseñado de esta manera por el equipo de Android. Por lo tanto, su servidor web puede ejecutarse perfectamente en localhost y desde su aplicación de Android puede acceder a través de " http://10.0.2.2:<hostport>".

Si su emulador debe acceder a Internet a través de un servidor proxy, puede configurar un proxy HTTP personalizado desde la pantalla de controles extendidos del emulador. Con el emulador abierto, haga clic en Más puntos y luego en Configuración y Proxy . Desde aquí, puede definir su propia configuración de proxy HTTP. captura de pantalla para la configuración HTTP


99
¿Por qué debería hacerlo? El error Bad Request significa que se puede acceder al servidor localhost, pero que la solicitud no es del todo correcta.
Dedicado

No estoy seguro, sigo, ¿qué estás diciendo exactamente? ¿Es relevante para la solución proporcionada?
Akhil Jain

No funciona para mí en este momento, pero aquí está el enlace a los documentos de Android y está claro que esto es lo que debería hacerlo (10.0.2.2); developer.android.com/tools/devices/emulator.html
Stuart Hallows

23
obviamente esto no aclara nada, Robin ya está usando 10.0.2.2 ip en la pregunta y no está funcionando. Aunque su respuesta es correcta, NO proporciona una solución.
iversoncru

Yo también obtengo 400: Error de solicitud incorrecta con la misma solución.
Keval Patel

55

Use 10.0.2.2 para AVD predeterminado y 10.0.3.2 para Genymotion


44
¿Por qué 10.0.3.2 para Genymotion?
Jacob

1
@Jacob Debido a que Genymotion es un emulador diferente y eligieron usar una IP diferente que el emulador de Google (lo que limita con inútil. En serio, ¿cuándo van a hacer algo con respecto a su horrible emulador predeterminado?)
Computrius

En API 28+, también debe permitir explícitamente el tráfico que no sea https (texto sin cifrar) en la configuración de su red. Vea mi respuesta a continuación stackoverflow.com/a/56769746/2290369
İsmail Yavuz

19

Me enfrenté al mismo problema en Visual Studio al ejecutar una aplicación web en IIS Express. para solucionarlo, debe ir a las propiedades de su proyecto y luego hacer clic en la pestaña Debug y cambiar http: // localhost: [YOUR PORT] a http://127.0.0.1:[YOUR PORT] y configure la URL de Android en http: / /10.0.2.2:[TU PUERTO]. Funcionó para mí.


1
esto junto con la url 10.0.0.2 lo resolvió por mí. esta configuración parecía estar anulando el enfoque de hosting.json explicado en otra parte.
user761574

1
Estoy ejecutando el servidor django localmente en macOS y generalmente accedo a él a través del http://localhost:5000/simulador Postman y iOS. Esta solución funciona para el simulador de Android y no es necesario modificar mi servidor, ni ninguna configuración en el simulador. Rápido, agradable y portátil a otras computadoras sin trabajo adicional.
John Pang

Aplicación de Android con xamarin y API web ASP.NET, ambas usando VS. ¡TRABAJÓ! ¡¡Gracias!!
Sohaib javed

15

Si está utilizando IIS Express, es posible que deba vincular todos los nombres de host en lugar de solo `localhost '. Mira esta buena respuesta:

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

Dígale a IIS Express que se una a todas las direcciones IP y nombres de host. En su archivo .config (generalmente% userprofile% \ My Documents \ IISExpress \ config \ applicationhost.config, o $ (solutionDir) .vs \ config \ applicationhost.config para Visual Studio 2015), busque el elemento de enlace de su sitio y agregue

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

Asegúrese de agregarlo como un segundo enlace en lugar de modificar el existente o VS simplemente volverá a agregar un nuevo sitio junto con un (1) Además, es posible que deba ejecutar VS como administrador.


No, no siempre necesita usar un nombre de host en blanco, blog.lextudio.com/…
Lex Li

<binding protocol = "http" bindingInformation = "*: 15000: 127.0.0.1" /> esta era la forma en que a IIS Express le gustaba donde 15000 era mi puerto y luego apuntaba a 10.0.2.2:15000 en el emulador de Android
dpineda

11

Lo resolví con la instalación de "Conveyor by Keyoti" en Visual Studio Professional 2015. El transportador genera una dirección REMOTA (su IP) con un puerto (45455) que permite la solicitud externa. Ejemplo:

ingrese la descripción de la imagen aquí

Conveyor le permite probar aplicaciones web desde tabletas y teléfonos externos en su red o desde emuladores de Android (sin http://10.0.2.2:<hostport>)

Los pasos están en el siguiente enlace:

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


¿Qué sucede si no ejecuta el servidor web en Visual Studio? Imo, esta no es una respuesta a la pregunta.
jAC

Lo intento pero después de algunos días la URL dada no funciona y no encuentro ninguna solución.
Md Imran Choudhury

Después de una larga lucha, lo único que funcionó fue instalar esta extensión y habilitar la función URL remota. La solicitud tarda un poco más en llegar a la API, pero funciona.
fabian278

9

Tengo un servidor web ejecutándose en mi localhost.

Si abro el emulador y quiero conectarme a mi host local que estoy usando 192.168.x.x. Esto significa que debe usar su dirección IP de LAN local. Por cierto, tu HttpResponseException (Bad Request)no significa que el host no sea accesible.

Algunos otros errores conducen a esta excepción.


9

Dado 10.0.2.2que no es un dominio seguro para Android, debe permitir dominios no seguros en la configuración de su red para API 28+ donde las conexiones no TLS se impiden de forma predeterminada.

Puede usar mis siguientes configuraciones:

Cree un nuevo archivo en main / res / xml / network_security_config.xml como:

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

Y apúntalo en AndroidManifest.xml

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

8

El problema es que el emulador de Android se asigna 10.0.2.2a 127.0.0.1, no a localhost. Así que configure su servidor web para serveron 127.0.0.1:54722y no localhost:54722. Deberias hacer eso.


7

Después de ejecutar su host local, llega http://localhost:[port number]/aquí y encuentra su número de puerto.

Luego obtenga su dirección IP del comando, abra el comando de Windows y escriba ipconfig ingrese la descripción de la imagen aquí

En mi caso, la IP era 192.168.10.33así que mi URL será http://192.168.10.33:[port number] /. En Android, el estudio usa esta URL como su URL. Y después de eso, configure su URL y su número de puerto en proxy manual para el emulador.

ingrese la descripción de la imagen aquí


3

necesitas configurar la URL como 10.0.2.2:portNr

portNr = el puerto dado por el servidor de desarrollo ASP.NET en el que se ejecuta mi servicio actual localhost:3229/Service.svc

entonces mi url es 10.0.2.2:3229

Había solucionado mi problema de esta manera

Espero que ayude...


3

"BadRequest" es un error que generalmente el servidor mismo envió , consulte el rfc 2616

10.4.1 400 Solicitud incorrecta

El servidor no pudo entender la solicitud debido a una sintaxis incorrecta. El cliente NO DEBE repetir la solicitud sin modificaciones.

Así que tiene una conexión funcional con el servidor, pero su solicitud no se ajusta al formulario expecet. No sé cómo se crea la conexión, qué encabezados están incluidos (si hay alguno), pero eso es lo que debe verificar.

Si necesita más ayuda, explique de qué se trata su código y qué utiliza para conectarse al servidor, de modo que tengamos una idea general.

Aquí hay una pregunta con el mismo problema: la respuesta fue que el tipo de contenido no estaba configurado en el encabezado.


Obtuviste el punto correcto, pero luego tomaste la dirección equivocada. El siguiente paso debería ser analizar el servidor para saber qué tipo de solicitudes le interesan, para comprender por qué las solicitudes de los emuladores se responden con 400. Aquí puede encontrar un estudio de caso para IIS Express, blog.lextudio.com/…
Lex Li

1

Me gustaría mostrarle la forma en que accedo a las API web IISExpress desde mi emulador de Android. Estoy usando Visual Studio 2015. Y llamo al emulador de Android desde Android Studio.

Todo lo que necesito hacer es agregar la siguiente línea a la configuración de enlace en mi archivo applicationhost.config

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

Luego verifico y uso la dirección IP4 para acceder a mi API desde el emulador de Android

Requisito: debe ejecutar Visual Studio como administrador. Esta publicación ofrece una manera perfecta de hacer esto.

Para más detalles, visite mi publicación en github

Espero que esto ayude.


2
O instale la extensión VS gratuita llamada Transportador desde la ventana Extensiones. Eso abre IIS Express a solicitudes externas sin cambiar la configuración.
Jim W dice que reinstale a Mónica

Tienes otras opciones, blog.lextudio.com/… que ejecutar VS como administrador. Así que no lo llamaré un deber .
Lex Li

1

Para usuarios de Laravel Homestead: si alguien usa Laravel con homestead, puede acceder al backend de la aplicación usando 192.168.10.10 en el emulador

¿Sigue sin funcionar? Otra buena solución es usar ngrok https://ngrok.com/


1

Estoy usando Windows 10 como mi plataforma de desarrollo, el acceso a 10.0.2.2:port en mi emulador no funciona como se esperaba, y el mismo resultado para otras soluciones también en esta pregunta.

Después de varias horas de excavación, descubrí que si agrega el argumento -writable-system al comando de inicio del emulador, las cosas simplemente funcionarán.

Tienes que iniciar un emulador a través de la línea de comando como a continuación:

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

Luego, en su emulador, puede acceder a su servicio API que se ejecuta en la máquina host, utilizando la dirección IP de LAN y el puerto de enlace:

http://192.168.1.2:<port>

Espero que esto te ayude.

Acerca del emulador de inicio desde la línea de comandos: https://developer.android.com/studio/run/emulator-commandline .


1

Para acceder a localhost en el emulador de Android

  • Agregue el permiso de internet de AndroidManifest.xml
    <uses-permission android:name="android.permission.INTERNET" />

  • Añadir android:usesCleartextTraffic="true", más detalles aquí :

  • Ejecute el comando mencionado a continuación para encontrar la dirección IP de su sistema:

ifconfig | grep "inet " | grep -v 127.0.0.1

Copie la dirección IP obtenida de este paso (A)

  • Ejecute su aplicación de back-end, a la que puede acceder en localhosto 127.0.0.1desde su sistema.

  • Ahora en Android Studio, puede reemplazar la URL si está usando un código o puede usar la dirección IP obtenida del paso (A) e intentar abrir en el navegador web, como esta http://192.168.0.102:8080/

No olvide agregar PUERTO después de la dirección IP, en mi caso la aplicación se estaba ejecutando en el puerto 8080, así que agregué la IP obtenida en (A) con el puerto 8080


0

localhost parecía estar funcionando bien en mi emulador al inicio y luego comencé a recibir la conexión denegada, utilicé 127.0.2.2 desde el navegador del emulador y funcionó, y cuando usé esto en mi aplicación de Android en el emulador, nuevamente comenzó a mostrar el problema de conexión rechazada .

luego hice ifconfig y usé la ip 192.168.2.2 y funcionó perfectamente


0

Solicitud incorrecta generalmente significa que el formato de los datos que está enviando es incorrecto. Puede ser una asignación de datos no coincidente. Si recibe una solicitud incorrecta, significa que puede conectarse al servidor, pero la solicitud no se envía correctamente.


0

Si alguien todavía está buscando esto, así es como funcionó para mí.

Debe encontrar la IP de su máquina con respecto al dispositivo / emulador al que está conectado. Para los emuladores, el camino es siguiendo los pasos a continuación;

  1. Vaya a la caja virtual de VM -> seleccione el dispositivo conectado en la lista.
  2. Seleccione Configuración -> Red-> Averigüe a qué red está conectado el dispositivo. Para mí fue 'VirtualBox Host-Only Ethernet Adapter # 2'.
  3. En virtualbox, vaya a Archivos-> Preferencias-> Red-> Redes solo de host y descubra el IPv4 para la red especificada en el paso anterior. (Al pasar el mouse obtendrás la información)

Proporcione esta IP para acceder al localhost desde el emulador. El puerto es el mismo que ha proporcionado al ejecutar / publicar sus servicios.

Nota n. ° 1: asegúrese de haberse ocupado de los firewalls y las reglas de entrada.

Nota # 2: Verifique esta IP después de reiniciar su máquina. Por alguna razón, incluso si proporcioné "Usar la siguiente IP" La IP de solo host cambió.


0

Resolví exactamente el problema cuando la capa de servicio usa Visual Studio IIS Express. Solo apunta a 10.0.2.2:port no funcionará. En lugar de jugar con el IIS Express como lo mencionan otras publicaciones, simplemente puse un proxy frente al IIS Express. Por ejemplo, apache o nginx. El nginx.conf se verá así

 # Mobile API
 server { 
    listen       8090;
    server_name  default_server;

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

Entonces, el Android necesita apuntar a mi dirección IP como 192.168.xx: 8090


0

si está utilizando algún paquete de terceros como node express o angular-cli, necesitará encontrar la IP de su máquina y conectar su host a esa IP dentro de la configuración de inicio del servidor (en lugar de localhost). Luego ejecútalo desde el emulador usando la IP. Por ejemplo, tuve que usar: ng serve -H 10.149.212.104para usar el angular-cli. Luego, desde el emulador utilicé:http://10.149.212.104:4200


0

1) Ejecute el comando ipconfig en cmd

2) Obtendrás un resultado como este ingrese la descripción de la imagen aquí

3) Luego use la dirección IPv4 del adaptador de red VMWare 1 seguido del número de puerto

En mi caso es 8080, así que en lugar de usar localhost: 8080

Estoy usando 192.168.56.1:8080

ingrese la descripción de la imagen aquí

Hecho.....


0

Explicación de por qué localhostno está disponible en los emuladores para cualquier persona que tenga un problema de acceso básico. Para casos sofisticados, lea otras respuestas.

Problema: el emulador tiene su propia red local y se localhostasigna al emulador , ¡pero NO a su host!

Solución:

  1. Vincula tu servidor para 0.0.0.0que esté disponible para la red del emulador
  2. Obtenga la dirección IP externa de su computadora portátil: ifconfigcomando para Mac
  3. En Android (o aplicación Flutter) use la dirección IP de su interfaz externa como: en 192.168.1.10lugar delocalhost

0

Tuve el mismo problema cuando intentaba conectarme a mi servicio web IIS .NET desde el emulador de Android.

  1. Instalar en pc npm install -g iisexpress-proxy
  2. iisexpress-proxy 53990 to 9000 al proxy IIS express port a 9000 y acceda al puerto 9000 desde el emulador como "http://10.0.2.2:9000"

la razón parece ser por defecto, IIS Express no permite conexiones desde la red https://forums.asp.net/t/2125232.aspx?Bad+Request+Invalid+Hostname+when+accessing+localhost+Web+API + o + Aplicación + web + desde + a través de + LAN

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.