Androidエミュレータからlocalhost:portにアクセスする


224

で実行するローカルマシンでWebサービスを実行していlocalhost:54722ます。

Androidエミュレーターで実行されているアプリからサービスを呼び出したいのですが。

10.0.2.2アプリで使用するとlocalhostにアクセスすることを読みましたが、ポート番号でも機能しないようです。それは言うHttpResponseException: Bad Request



1
すべてのポートが転送されるわけではないという動作が予想されました... 5555は転送されませんでしたが、8080および8081は問題なく動作しました...
Florian Loch

vs-iis構成ファイルを編集する必要があります:stackoverflow.com/a/50991257/7149454
Nick Kovalsky

回答:


408

IPアドレス " 10.0.2.2"でホストマシンにアクセスできます。

これは、Androidチームによってこのように設計されています。そのため、ウェブサーバーはlocalhostで完全に実行でき、Androidアプリから「http://10.0.2.2:<hostport>」経由でアクセスできます。

エミュレータがプロキシサーバー経由でインターネットにアクセスする必要がある場合は、エミュレータの[拡張コントロール]画面からカスタムHTTPプロキシを構成できます。エミュレーターを開いた状態で、[ その他 ドット ]をクリックし、[ 設定プロキシ ]をクリックします。ここから、独自のHTTPプロキシ設定を定義できます。 HTTP構成のスクリーンショット


9
なぜそうすべきなのでしょうか?ローカルホストサーバが到達可能であることが、リクエストが..かなり正しくないというエラー不正な要求手段
Dediqated

私はよくわかりません、私はフォローします、あなたは正確に何を言っています、それは提供されたソリューションに関連していますか?
Akhil Jain 2013

現在私のために働いていませんが、ここにAndroidドキュメントへのリンクがあります。これがそうすることで明らかになります(10.0.2.2)。developer.android.com/tools/devices/emulator.html
Stuart Hallows 2014年

23
明らかにこれは何も明確にしていません。ロビンはすでに質問で10.0.2.2 ipを使用しており、動作していません。あなたの答えは正しいですが、それは解決策を提供しません。
iversoncru 2015

私も400を取得:同じ解決策での不正なリクエストエラー。
Keval Patel、2015

55

デフォルトのAVDには10.0.2.2、Genymotionには10.0.3.2を使用します


4
Genymotionが10.0.3.2なのはなぜですか?
ジェイコブ

1
@Jacob Genymotionは別のエミュレーターであり、Googleのエミュレーターとは異なるIPを使用することを選択したため(役に立たない境界線。深刻なことに、いつ彼らはひどいデフォルトエミュレーターについて何かをするのですか?)
computrius

API 28以降では、ネットワーク構成でも非https(クリアテキスト)トラフィックを明示的に許可する必要があります。以下の私の回答をご覧ください。stackoverflow.com
a / 56769746/2290369 –İsmailYavuz

19

IIS ExpressでWebアプリを実行するVisual Studioでも同じ問題に直面しました。これを修正するには、プロジェクトのプロパティに移動し、[デバッグ]タブをクリックして、http:// localhost:[YOUR PORT]をhttp://127.0.0.1:[YOUR PORT]に変更し、android urlをhttp:/に設定する必要があります。 /10.0.2.2:[あなたのポート]。それは私のために働いた。


1
これを10.0.0.2のURLと組み合わせることで解決しました。この設定は、他で説明されているhosting.jsonアプローチをオーバーライドしているようです。
user761574 2018

1
私はdjangoサーバーをmacOSでローカルに実行しており、通常http://localhost:5000/、PostmanとiOSシミュレーターの両方からアクセスします。このソリューションはAndroidシミュレーターで機能し、サーバーやシミュレーターの設定を変更する必要はありません。手間がかからず、すばやく、他のコンピュータに移植できます。
John Pang

xamarinとASP.NET Web APIを備えたAndroidアプリ(どちらもVSを使用)。働いた!ありがとう!!
sohaib javed

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 for Visual Studio 2015)で、サイトのバインディング要素を見つけて追加します

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

既存のサイトを変更するのではなく、2番目のバインドとして追加するようにしてください。そうしないと、VSは新しいサイトを追加し、追加し(1) ます。また、管理者としてVSを実行する必要がある場合もあります。


いいえ、常に空白のホスト名を使用する必要はありません。blog.lextudio.com/…
Lex Li

<binding protocol = "http" bindingInformation = "*:15000:127.0.0.1" />これは、15000が私のポートで、IIS Expressが好きだった方法で、Androidエミュレータで10.0.2.2:15000を指しています
dpineda

11

Visual Studio Professional 2015に「Conveyor by Keyoti」をインストールして解決しました。Conveyorは、外部リクエストを有効にするポート(45455)でリモートアドレス(IP)を生成します。例:

ここに画像の説明を入力してください

コンベアにより、ネットワーク上の外部タブレットや携帯電話から、またはAndroidエミュレーター(なしhttp://10.0.2.2:<hostport>)からWebアプリケーションをテストできます

手順は次のリンクにあります。

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


Visual Studio内でWebサーバーを実行しない場合はどうなりますか?イモ、これは質問に対する答えではありません。
jAC 2017年

私は試してみましたが、数日後、指定されたURLが機能せず、解決策が見つかりません。
Md Imran Choudhury

長い闘争の後、トリックを実行した唯一のことは、この拡張機能をインストールしてリモートURL機能を有効にすることでした。リクエストがAPIに到達するまでに少し時間がかかりますが、機能します。
fabian278

9

ローカルホストでウェブサーバーを実行しています。

エミュレータを開いてlocalhostに接続したい場合は、を使用してい192.168.x.xます。つまり、ローカルLAN IPアドレスを使用する必要があります。ところで、あなたHttpResponseException (Bad Request)がホストに到達できないということではありません。

他のいくつかのエラーがこの例外につながります。


9

以来10.0.2.2あなたは非TLS接続がデフォルトで阻止されているAPI 28+のためのネットワーク構成で非セキュアなドメイン許可する必要がAndroidのための安全なドメインではありません。

私の次の構成を使用できます。

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.2127.0.0.1なくにマップすることlocalhostです。したがって、Webサーバーをserveronでは127.0.0.1:54722なくserveronに構成しますlocalhost:54722。それでうまくいくはずです。


7

ローカルホストを実行した後http://localhost:[port number]/、ポート番号を見つけました。

次に、コマンドからIPアドレスを取得し、Windowsコマンドを開いて、次のように入力します。 ipconfig ここに画像の説明を入力してください

私の場合、IPだった192.168.10.33ので、URLはhttp://192.168.10.33:[ポート番号] /になります。Androidでは、スタジオはこのURLをURLとして使用します。その後、エミュレータの手動プロキシでURLとポート番号を設定します。

ここに画像の説明を入力してください


3

URLを次のように設定する必要があります 10.0.2.2:portNr

portNr = 現在のサービスが実行されているASP.NET開発サーバーによって指定されたポート localhost:3229/Service.svc

だから私のURLは 10.0.2.2:3229

この方法で問題を解決しました

それが役に立てば幸い...


3

「BadRequestは」を参照してください、通常はサーバ自体でお送りしまったエラーであるRFC 2616を

10.4.1 400 Bad Request

不正な構文のため、サーバーはリクエストを理解できませんでした。クライアントは変更せずにリクエストを繰り返すべきではありません。

そのため、サーバーへの接続は機能していますが、リクエストが形式に適合していません。接続を作成する方法、含まれるヘッダー(存在する場合)はわかりませんが、それを確認する必要があります。

さらにヘルプが必要な場合は、コードの概要とサーバーへの接続に使用するコードを説明してください。

これは同じ問題のある質問です。答えは、コンテンツタイプがヘッダーに設定されていなかったというものでした。


あなたは正しいポイントを得ましたが、その後間違った方向に行きました。次のステップは、サーバーを分析して、どのような種類の要求を処理するかを学習し、エミュレータからの要求が400で応答される理由を理解することです。IISExpressの
Lex Li

1

AndroidエミュレーターからIISExpress Web APIにアクセスする方法を紹介します。私はVisual Studio 2015を使用しています。AndroidStudioからAndroid Emulatorを呼び出します。

私がする必要があるのは、applicationhost.configファイルのバインディング構成に次の行を追加することだけです。

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

次に、IP4アドレスを確認して使用し、AndroidエミュレーターからAPIにアクセスします

要件: Visual Studioを管理者として実行する必要があります。この投稿は、これを行うのに最適な方法を提供します。

詳細については、githubの私の投稿をご覧ください。

お役に立てれば。


2
または、ExtensionsウィンドウからConveyorと呼ばれる無料のVS Extensionをインストールします。これにより、構成を変更せずにIIS Expressが外部の要求に開かれます。
ジムWはモニカを

管理者としてVSを実行する以外に、blog.lextudio.com /…というオプションがあります。だから私はそれをマストとは呼びません
Lex Li

1

Laravel Homesteadユーザーの場合:HomesteadでLaravelを使用している場合、エミュレーターで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

次に、エミュレーターで、LAN IPアドレスとバインディングポートを使用して、ホストマシンで実行されているAPIサービスにアクセスできます。

http://192.168.1.2:<port>

これがお役に立てば幸いです。

コマンドラインからのエミュレーターの開始について:https : //developer.android.com/studio/run/emulator-commandline


1

Android Emulatorでlocalhostにアクセスするには

  • 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を置き換えることができます。または、ステップ(A)から取得したIPアドレスを使用して、次のようにWebブラウザーで開いてみてくださいhttp://192.168.0.102:8080/

IPアドレスの後にPORTを追加することを忘れないでください。私の場合、アプリは8080ポートで実行されていたため、(A)で取得したIPをポート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. virtualboxで[ファイル]-> [設定]-> [ネットワーク]-> [ホストオンリーネットワーク]に移動し、上記のステップで指定したネットワークのIPv4を見つけます。(ホバリングすると情報が表示されます)

エミュレータからローカルホストにアクセスするには、このIPを提供します。ポートは、サービスの実行/公開中に提供したものと同じです。

注#1:ファイアウォールと受信ルールに注意してください。

注2:マシンを再起動した後、このIPを確認してください。なんらかの理由で、「次のIPを使用する」を指定しても、ホストオンリーIPが変更されました。


0

サービスレイヤーがVisual Studio IIS Expressを使用しているときの問題を正確に解決しました。10.0.2.2をポイントするだけで、ポートは機能しません。他の投稿で言及されているようにIIS Expressをいじるのではなく、IIS Expressの前にプロキシを配置するだけです。たとえば、apacheまたはnginx。nginx.confは次のようになります

 # Mobile API
 server { 
    listen       8090;
    server_name  default_server;

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

次に、Androidは192.168.xx:8090として私のIPアドレスをポイントする必要があります


0

node expressやangular-cliのようなサードパーティのパッケージを使用している場合は、マシンのIPを検索し、ホストをサーバーの起動構成内で(localhostではなく)そのIPに接続する必要があります。次に、IPを使用してエミュレータから起動します。たとえば、私は使用しなければなりませんでした:ng serve -H 10.149.212.104angular-cliを使用するには。次に、私が使用したエミュレータから:http://10.149.212.104:4200


0

1)cmdでipconfigコマンドを実行します

2)あなたはこのような結果を得るでしょう ここに画像の説明を入力してください

3)次に、VMWareネットワークアダプター1のIPv4アドレスに続けてポート番号を使用します。

私の場合は8080なので、localhost:8080を使用する代わりに

192.168.56.1:8080を使用しています

ここに画像の説明を入力してください

完了しました。


0

localhost基本的なアクセスの問題を抱えているすべての人がエミュレータから利用できない理由を説明します。洗練されたケースについては、他の答えを読んでください。

問題:エミュレータには独自のローカルネットワークがありlocalhostエミュレータにマッピングされますが、ホストにはマッピングされません。

解決:

  1. サーバーを0.0.0.0にバインドして、エミュレータのネットワークで使用できるようにします
  2. ラップトップの外部IPアドレスを取得する:ifconfigMac用コマンド
  3. Android(またはFlutterアプリ)192.168.1.10では、次のような外部インターフェイスのIPアドレスを使用します。localhost

0

AndroidエミュレーターからIIS .NET Webサービスに接続しようとしたときにも、同じ問題が発生しました。

  1. インストール npm install -g iisexpress-proxy
  2. iisexpress-proxy 53990 to 9000 IISエクスプレスポートを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 + from + across + LAN

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.