Acessando localhost: port do emulador Android

224

Estou executando um serviço da web na minha máquina local que é executada em localhost:54722.

Quero chamar o serviço a partir de um aplicativo em execução no emulador do Android.

Eu li que o uso 10.0.2.2no aplicativo acessaria o host local, mas também não parece funcionar com o número da porta. Diz HttpResponseException: Bad Request.

Robin
fonte
1
Eu esperava que o comportamento, que nem todas as portas são encaminhadas ... 5555 não foi encaminhado, mas 8080 e 8081 funcionou muito bem ...
Florian Loch
Você precisa editar o seu vs-IIS arquivo de configuração: stackoverflow.com/a/50991257/7149454
Nick Kovalsky

Respostas:

408

Você pode acessar sua máquina host com o endereço IP " 10.0.2.2".

Isso foi projetado dessa maneira pela equipe do Android. Assim, seu servidor da Web pode funcionar perfeitamente no host local e, no seu aplicativo Android, você pode acessá-lo via " http://10.0.2.2:<hostport>".

Se o seu emulador precisar acessar a Internet através de um servidor proxy, você poderá configurar um proxy HTTP personalizado na tela de controles Estendida do emulador. Com o emulador aberto, clique em Mais pontos e clique em Configurações e Proxy . A partir daqui, você pode definir suas próprias configurações de proxy HTTP. captura de tela para configuração HTTP

Akhil Jain
fonte
9
Por que deveria? O erro Solicitação incorreta significa que o servidor localhost está acessível, mas que a solicitação não está correta.
Dediqated
Não sei ao certo, o que exatamente você está dizendo, é relevante para a solução fornecida?
Akhil Jain
Não está funcionando para mim no momento, mas aqui está o link para os documentos do Android e está claro que é isso que deve ser feito (10.0.2.2); developer.android.com/tools/devices/emulator.html
Stuart Hallows
23
obviamente isso não esclarece nada, Robin já está usando 10.0.2.2 ip na questão e não está funcionando. Embora sua resposta esteja correta, ela NÃO fornece uma solução.
iversoncru
Eu também recebo 400: Erro de solicitação incorreta com a mesma solução.
Keval Patel
55

Use 10.0.2.2 para AVD padrão e 10.0.3.2 para Genymotion

Vinod Joshi
fonte
4
Por que 10.0.3.2 para Genymotion?
Jacob
1
@ Jacob Como o Genymotion é um emulador diferente e eles escolheram usar um ip diferente do emulador do google (que fica inútil. Sério, quando eles farão algo com seu terrível emulador padrão?)
computrius
Na API 28+, você também deve permitir explicitamente o tráfego não https (texto não criptografado) na sua configuração de rede. Veja minha resposta abaixo stackoverflow.com/a/56769746/2290369
İsmail Yavuz
19

Eu enfrentei o mesmo problema no Visual Studio executando um aplicativo Web no IIS Express. Para corrigi-lo, você precisa acessar as propriedades do projeto, clicar na guia Debug e alterar http: // localhost: [YOUR PORT] para http://127.0.0.1:[YOUR PORT] e defina o URL do Android como http: / /10.0.2.2:[Your PORT]. funcionou para mim.

Ehsan Zargar Ershadi
fonte
1
isso em conjunto com o URL 10.0.0.2 resolveu para mim. essa configuração parecia substituir a abordagem hosting.json explicada em outro lugar.
user761574
1
Estou executando o servidor django localmente no macOS e, geralmente, eu o acesso através do http://localhost:5000/simulador Postman e iOS. Esta solução funciona para o simulador Android e não há necessidade de modificar meu servidor, nem qualquer configuração no simulador. Rápido, agradável e portátil para outros computadores sem trabalho extra.
John Pang
Aplicativo para Android com xamarin e APIs da Web do ASP.NET usando VS. TRABALHOU! Obrigado!!
sohaib javed
15

Se você estiver usando o IIS Express, poderá ser necessário vincular a todos os nomes de host em vez de apenas `localhost '. Verifique esta boa resposta:

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

Diga ao próprio IIS Express para se conectar a todos os endereços IP e nomes de host. No arquivo .config (normalmente% userprofile% \ Meus Documentos \ IISExpress \ config \ applicationhost.config ou $ (solutionDir) .vs \ config \ applicationhost.config do Visual Studio 2015), localize o elemento de ligação do seu site e adicione

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

Certifique-se de adicioná-lo como uma segunda ligação, em vez de modificar o existente ou o VS apenas adicionará novamente um novo site anexado com um (1) Além disso, pode ser necessário executar o VS como administrador.

Hugh Jeffner
fonte
Não, você nem sempre precisa usar o nome em branco host, blog.lextudio.com/...
Lex Li
<binding protocol = "http" bindingInformation = "*: 15000: 127.0.0.1" /> era assim que o IIS Express gostava, onde 15000 era minha porta e depois apontava para 10.0.2.2:15000 no emulador Android
dpineda
11

Eu o resolvi com a instalação do "Conveyor by Keyoti" no Visual Studio Professional 2015. O transportador gera um endereço REMOTE (seu IP) com uma porta (45455) que permite solicitação externa. Exemplo:

insira a descrição da imagem aqui

O Transportador permite testar aplicativos da Web de tablets e telefones externos na sua rede ou de emuladores Android (sem http://10.0.2.2:<hostport>)

As etapas estão no seguinte link:

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

Ronny Morán
fonte
E se você não executar o servidor da web no Visual Studio? Imo, isso não é uma resposta para a pergunta.
JAC
Eu tento, mas alguns dias depois, o URL fornecido não está funcionando e não encontramos nenhuma solução.
Md Imran Choudhury
Após uma longa luta, a única coisa que fez o truque foi instalar esta extensão e ativar o recurso URL Remoto. A solicitação demora um pouco mais para atingir a API, mas funciona.
fabian278 16/06
9

Eu tenho um servidor web rodando no meu host local.

Se eu abrir o emulador e quiser conectar-me ao meu host local, estou usando 192.168.x.x. Isso significa que você deve usar seu endereço LAN local. A propósito, o seu HttpResponseException (Bad Request)não significa que o host não esteja acessível.

Alguns outros erros levam a essa exceção.

Marco
fonte
9

Como o 10.0.2.2domínio não é seguro para o Android, é necessário permitir domínios não seguros na configuração de rede da API 28+, onde conexões não TLS são impedidas por padrão.

Você pode usar as seguintes configurações:

Crie um novo arquivo em 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>

E aponte-o para AndroidManifest.xml

<application
......
......
android:networkSecurityConfig="@xml/network_security_config">
İsmail Yavuz
fonte
8

O problema é que o emulador do Android mapeia 10.0.2.2para 127.0.0.1, e não para localhost. Portanto, configure seu servidor web para serveron 127.0.0.1:54722e não localhost:54722. Isso deve resolver.

Cobus Kruger
fonte
7

Depois de executar o host local, você chegou http://localhost:[port number]/aqui e encontrou o número da porta.

Em seguida, obtenha seu endereço IP em Comando, abra o comando Windows e digite ipconfig insira a descrição da imagem aqui

No meu caso, o IP era 192.168.10.33assim, minha URL será http://192.168.10.33:[ número da porta ] /. No Android, o estúdio usa esse URL como seu URL. Depois disso, defina seu URL e número da porta no proxy manual do emulador.

insira a descrição da imagem aqui

Md Imran Choudhury
fonte
3

você precisa definir o URL como 10.0.2.2:portNr

portNr = a porta fornecida pelo ASP.NET Development Server em que meu serviço atual está sendo executado localhost:3229/Service.svc

então meu url é 10.0.2.2:3229

eu consertei meu problema dessa maneira

Espero que ajude...

lomec
fonte
3

"BadRequest" é um erro que geralmente é enviado pelo próprio servidor, consulte rfc 2616

10.4.1 400 Solicitação incorreta

A solicitação não pôde ser entendida pelo servidor devido à sintaxe incorreta. O cliente não deve repetir o pedido sem modificações.

Então você tem uma conexão ativa com o servidor, mas sua solicitação não se encaixa no formulário expecet. Não sei como você cria a conexão, quais cabeçalhos estão incluídos (se houver) - mas é isso que você deve verificar.

Se você precisar de mais ajuda, explique sobre o que é seu código e o que ele usa para se conectar ao servidor, para que tenhamos uma visão geral.

Aqui está uma pergunta com o mesmo problema - a resposta foi que o tipo de conteúdo não foi definido no cabeçalho.

Marvin Emil Brach
fonte
Você entendeu o ponto certo, mas seguiu na direção errada. A próxima etapa deve ser analisar o servidor para saber com que tipo de solicitações ele se importa, para entender por que as solicitações dos emuladores são respondidas com 400. Um estudo de caso para o IIS Express pode ser encontrado aqui, blog.lextudio.com/…
Lex Li
1

Gostaria de mostrar a você como acesso as APIs da Web IISExpress no meu Emulador do Android. Estou usando o Visual Studio 2015. E chamo o emulador do Android do Android Studio.

Tudo o que eu preciso fazer é adicionar a seguinte linha à configuração de ligação no meu arquivo applicationhost.config

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

Depois, verifico e uso o endereço IP4 para acessar minha API no emulador do Android

Requisito: você deve executar o Visual Studio como administrador. Este post fornece uma maneira perfeita de fazer isso.

Para mais detalhes, visite meu post no github

Espero que isto ajude.

Nguyen Minh Hien
fonte
2
Ou instale o VS Extension gratuito chamado Conveyor na janela Extensions. Isso abre o IIS Express para solicitações externas sem alterar a configuração.
Jim W diz que restabelece Monica
Você tem outras opções, blog.lextudio.com/… , além de executar o VS como administrador. Portanto, não vou chamar isso de obrigatório .
Lex Li
1

Para usuários do Laravel Homestead: se alguém usando o Laravel com homestead, você pode acessar o back-end do aplicativo usando 192.168.10.10 no emulador

Ainda não funciona? Outra boa solução é usar o ngrok https://ngrok.com/

Nomi
fonte
1

Estou usando o Windows 10 como minha plataforma de desenvolvimento, acessando 10.0.2.2:port no meu emulador não está funcionando conforme o esperado e o mesmo resultado para outras soluções nesta questão também.

Após várias horas de escavação, descobri que se você adicionar -writable-system argumento ao comando de inicialização do emulador, tudo funcionará.

Você precisa iniciar um emulador via linha de comando, como abaixo:

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

Em seu emulador, você pode acessar o serviço de API em execução na máquina host, usando o endereço IP da LAN e a porta de ligação:

http://192.168.1.2:<port>

Espero que isso ajude você.

Sobre o início do emulador na linha de comando: https://developer.android.com/studio/run/emulator-commandline .

winiex
fonte
1

Para acessar o host local no emulador do Android

  • Adicione a permissão da Internet no AndroidManifest.xml
    <uses-permission android:name="android.permission.INTERNET" />

  • Adicione android:usesCleartextTraffic="true", mais detalhes aqui :

  • Execute o comando abaixo mencionado para encontrar o endereço IP do seu sistema:

ifconfig | grep "inet " | grep -v 127.0.0.1

Copie o endereço IP obtido nesta etapa (A)

  • Execute o aplicativo back-end, que você pode acessar no localhostou a 127.0.0.1partir do seu sistema.

  • Agora, no android studio, você pode substituir o URL se estiver usando o código ou o endereço IP obtido na etapa (A) e tentar abrir no navegador da Web, como este http://192.168.0.102:8080/

Não se esqueça de adicionar PORT após o endereço IP, no meu caso, o aplicativo estava sendo executado na porta 8080, então adicionei o IP obtido em (A) com a porta 8080

Lavish
fonte
0

localhost parecia estar funcionando bem no meu emulador no início e, em seguida, comecei a receber a exceção recusada pela conexão, usei 127.0.2.2 no navegador emulador e funcionou e quando usei isso no meu aplicativo Android no emulador, ele novamente começou a mostrar o problema de conexão recusada .

então eu fiz ifconfig e usei o ip 192.168.2.2 e funcionou perfeitamente

user2368055
fonte
0

Solicitação incorreta geralmente significa que o formato dos dados que você está enviando está incorreto. Pode ser um mapeamento de dados incompatível. Se você estiver recebendo uma solicitação incorreta, poderá conectar-se ao servidor, mas a solicitação não está sendo enviada corretamente.

Karthik
fonte
0

Se alguém ainda está procurando por isso, é assim que funcionou para mim.

Você precisa encontrar o IP da sua máquina em relação ao dispositivo / emulador ao qual está conectado. Para os emuladores, o caminho é seguir as etapas abaixo;

  1. Vá para a caixa Virtual da VM -> selecione o dispositivo conectado na lista.
  2. Selecione Configurações -> Rede-> Descubra a qual rede o dispositivo está conectado. Para mim, era o 'VirtualBox Host-Only Ethernet Adapter # 2'.
  3. Na caixa virtual, vá para Arquivos-> Preferências-> Rede-> Redes somente para host e descubra o IPv4 da rede especificada na etapa acima. (Ao passar o mouse, você obterá as informações)

Forneça esse IP para acessar o host local a partir do emulador. A porta é a mesma que você forneceu ao executar / publicar seus serviços.

Nota 1: verifique se você cuidou dos firewalls e das regras de entrada.

Nota 2: Verifique este IP depois de reiniciar sua máquina. Por algum motivo, mesmo que eu tenha fornecido "Usar o seguinte IP", o IP somente para host foi alterado.

skillworks
fonte
0

Resolvi o problema exato quando a camada de serviço está usando o Visual Studio IIS Express. Basta apontar para 10.0.2.2:port não funcionará. Em vez de mexer no IIS Express, como mencionado em outras postagens, apenas coloquei um proxy na frente do IIS Express. Por exemplo, apache ou nginx. O nginx.conf terá a aparência de

 # Mobile API
 server { 
    listen       8090;
    server_name  default_server;

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

Em seguida, o android precisa apontar para o meu endereço IP como 192.168.xx: 8090

Denis Wang
fonte
0

se você estiver usando algum pacote de terceiros, como node express ou angular-cli, será necessário encontrar o IP da sua máquina e anexar seu host a esse IP na configuração de inicialização do servidor (em vez de localhost). Em seguida, inicie-o no emulador usando o IP. Por exemplo, eu tive que usar: ng serve -H 10.149.212.104usar o angular-cli. Então no emulador eu usei:http://10.149.212.104:4200

Helzgate
fonte
0

1) Execute o comando ipconfig no cmd

2) Você obterá resultados como este insira a descrição da imagem aqui

3) Em seguida, use o endereço IPv4 do VMWare Network Adapter 1 seguido pelo número da porta

No meu caso, é 8080, então, em vez de usar localhost: 8080

Estou usando 192.168.56.1:8080

insira a descrição da imagem aqui

Feito.....

Ameya Salagre
fonte
0

Explicação por que localhostnão está disponível nos emuladores para quem tem um problema básico de acesso. Para casos sofisticados, leia outras respostas.

Problema: O emulador possui rede local própria e localhostmapeia-se para o emulador , mas NÃO para o seu host!

Solução:

  1. Ligue o servidor para 0.0.0.0disponibilizá-lo para a rede do emulador
  2. Obter endereço IP externo do seu laptop: ifconfigcomando para Mac
  3. No Android (ou aplicativo Flutter), use o endereço IP da sua interface externa como: em 192.168.1.10vez delocalhost
DenisKolodin
fonte
0

Eu tive o mesmo problema quando tentava me conectar ao meu serviço Web .NET do IIS a partir do emulador Android.

  1. instalar npm install -g iisexpress-proxy
  2. iisexpress-proxy 53990 to 9000 para proxy porta expressa do IIS para 9000 e acessar a porta 9000 do emulador como "http://10.0.2.2:9000"

o motivo parece ser o padrão, o IIS Express não permite conexões da rede https://forums.asp.net/t/2125232.aspx?Bad+Request+Invalid+Hostname+when+accessing+localhost+Web+API + ou + Web + App + de + na + LAN

kakopappa
fonte