で実行するローカルマシンでWebサービスを実行していlocalhost:54722
ます。
Androidエミュレーターで実行されているアプリからサービスを呼び出したいのですが。
10.0.2.2
アプリで使用するとlocalhostにアクセスすることを読みましたが、ポート番号でも機能しないようです。それは言うHttpResponseException: Bad Request
。
で実行するローカルマシンでWebサービスを実行していlocalhost:54722
ます。
Androidエミュレーターで実行されているアプリからサービスを呼び出したいのですが。
10.0.2.2
アプリで使用するとlocalhostにアクセスすることを読みましたが、ポート番号でも機能しないようです。それは言うHttpResponseException: Bad Request
。
回答:
IPアドレス " 10.0.2.2
"でホストマシンにアクセスできます。
これは、Androidチームによってこのように設計されています。そのため、ウェブサーバーはlocalhostで完全に実行でき、Androidアプリから「http://10.0.2.2:<hostport>
」経由でアクセスできます。
エミュレータがプロキシサーバー経由でインターネットにアクセスする必要がある場合は、エミュレータの[拡張コントロール]画面からカスタムHTTPプロキシを構成できます。エミュレーターを開いた状態で、[ その他 ]をクリックし、[ 設定とプロキシ ]をクリックします。ここから、独自のHTTPプロキシ設定を定義できます。
デフォルトのAVDには10.0.2.2、Genymotionには10.0.3.2を使用します
IIS ExpressでWebアプリを実行するVisual Studioでも同じ問題に直面しました。これを修正するには、プロジェクトのプロパティに移動し、[デバッグ]タブをクリックして、http:// localhost:[YOUR PORT]をhttp://127.0.0.1:[YOUR PORT]に変更し、android urlをhttp:/に設定する必要があります。 /10.0.2.2:[あなたのポート]。それは私のために働いた。
http://localhost:5000/
、PostmanとiOSシミュレーターの両方からアクセスします。このソリューションはAndroidシミュレーターで機能し、サーバーやシミュレーターの設定を変更する必要はありません。手間がかからず、すばやく、他のコンピュータに移植できます。
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を実行する必要がある場合もあります。
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
以来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">
ローカルホストを実行した後http://localhost:[port number]/
、ポート番号を見つけました。
次に、コマンドからIPアドレスを取得し、Windowsコマンドを開いて、次のように入力します。 ipconfig
私の場合、IPだった192.168.10.33
ので、URLはhttp://192.168.10.33:[ポート番号] /になります。Androidでは、スタジオはこのURLをURLとして使用します。その後、エミュレータの手動プロキシでURLとポート番号を設定します。
「BadRequestは」を参照してください、通常はサーバ自体でお送りしまったエラーであるRFC 2616を
10.4.1 400 Bad Request
不正な構文のため、サーバーはリクエストを理解できませんでした。クライアントは変更せずにリクエストを繰り返すべきではありません。
そのため、サーバーへの接続は機能していますが、リクエストが形式に適合していません。接続を作成する方法、含まれるヘッダー(存在する場合)はわかりませんが、それを確認する必要があります。
さらにヘルプが必要な場合は、コードの概要とサーバーへの接続に使用するコードを説明してください。
これは同じ問題のある質問です。答えは、コンテンツタイプがヘッダーに設定されていなかったというものでした。
AndroidエミュレーターからIISExpress Web APIにアクセスする方法を紹介します。私はVisual Studio 2015を使用しています。AndroidStudioからAndroid Emulatorを呼び出します。
私がする必要があるのは、applicationhost.configファイルのバインディング構成に次の行を追加することだけです。
<binding protocol="http" bindingInformation="*:<your-port>:" />
次に、IP4アドレスを確認して使用し、AndroidエミュレーターからAPIにアクセスします
要件: Visual Studioを管理者として実行する必要があります。この投稿は、これを行うのに最適な方法を提供します。
詳細については、githubの私の投稿をご覧ください。
お役に立てれば。
Laravel Homesteadユーザーの場合:HomesteadでLaravelを使用している場合、エミュレーターで192.168.10.10を使用してアプリバックエンドにアクセスできます。
まだ動作していません?別の良い解決策は、ngrok https://ngrok.com/を使用することです
私は開発プラットフォームとして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。
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で追加しました
開始時にエミュレータでlocalhostが正常に機能しているように見え、その後、接続拒否の例外が発生し始めました。エミュレータブラウザから127.0.2.2を使用し、それが機能しました。これをエミュレータのAndroidアプリで使用すると、接続拒否の問題が表示され始めました。 。
次に、ifconfigを実行し、IP 192.168.2.2を使用しましたが、完全に機能しました
誰かがまだこれを探しているなら、これが私にとってうまくいった方法です。
接続しているデバイス/エミュレーターに関するマシンのIPを見つける必要があります。エミュレータの場合は、以下の手順に従ってください。
エミュレータからローカルホストにアクセスするには、このIPを提供します。ポートは、サービスの実行/公開中に提供したものと同じです。
注#1:ファイアウォールと受信ルールに注意してください。
注2:マシンを再起動した後、このIPを確認してください。なんらかの理由で、「次のIPを使用する」を指定しても、ホストオンリーIPが変更されました。
サービスレイヤーが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アドレスをポイントする必要があります
localhost
基本的なアクセスの問題を抱えているすべての人がエミュレータから利用できない理由を説明します。洗練されたケースについては、他の答えを読んでください。
問題:エミュレータには独自のローカルネットワークがありlocalhost
、エミュレータにマッピングされますが、ホストにはマッピングされません。
解決:
0.0.0.0
にバインドして、エミュレータのネットワークで使用できるようにしますifconfig
Mac用コマンド192.168.1.10
では、次のような外部インターフェイスのIPアドレスを使用します。localhost
AndroidエミュレーターからIIS .NET Webサービスに接続しようとしたときにも、同じ問題が発生しました。
npm install -g iisexpress-proxy
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