localhost:54722
で実行されるローカルマシンでWebサービスを実行しています。
Androidエミュレーターで実行されているアプリからサービスを呼び出したい。
アプリで10.0.2.2
を使用するとlocalhostにアクセスしますが、ポート番号でも機能しないようです。 HttpResponseException: Bad Request
と表示されます。
IPアドレス「10.0.2.2
」でホストマシンにアクセスできます。
これは、Androidチームによってこのように設計されています。したがって、ウェブサーバーはローカルホストで完全に実行でき、Androidアプリから「http://10.0.2.2:<hostport>
」経由でアクセスできます。
エミュレータがプロキシサーバー経由でインターネットにアクセスする必要がある場合は、エミュレータの[拡張コントロール]画面からカスタムHTTPプロキシを構成できます。エミュレータを開いた状態で、More をクリックし、SettingsおよびProxyをクリックします。ここから、独自のHTTPプロキシ設定を定義できます。
デフォルトのAVDには10.0.2.2を使用し、Genymotionには10.0.3.2を使用します
IIS Expressを使用している場合は、単に「localhost」ではなく、すべてのホスト名にバインドする必要があります。この細かい答えを確認してください:
https://stackoverflow.com/a/15809698/383761
すべてのIPアドレスとホスト名にバインドするようにIIS Express自体に伝えます。 .configファイル(通常%userprofile%\ My Documents\IISExpress\config\applicationhost.config、またはVisual Studio 2015の場合は$(solutionDir).vs\config\applicationhost.config)で、サイトのバインディング要素を見つけて追加します
<binding protocol="http" bindingInformation="*:8080:*" />
既存のバインディングを変更するのではなく、2番目のバインディングとして追加するようにしてください。そうしないと、VSは(1)
を追加した新しいサイトを再追加するだけでなく、VSを管理者として実行する必要があります。
Visual Studio Professional 2015に「Conveyor by Keyoti」をインストールすることで解決しました。Conveyorは、外部要求を有効にするポート(45455)でリモートアドレス(IP)を生成します。例:
Conveyorを使用すると、ネットワーク上の外部タブレットや携帯電話から、またはAndroidエミュレーター(http://10.0.2.2:<hostport>
なし)からWebアプリケーションをテストできます。
手順は次のリンクにあります。
https://marketplace.visualstudio.com/items?itemName=vs-publisher-1448185.ConveyorbyKeyoti
IIS ExpressでWebアプリを実行するVisual Studioで同じ問題に直面しました。修正するには、プロジェクトのプロパティに移動し、[デバッグ]タブをクリックして、 http:// localhost:[YOUR PORT]を http://127.0.0.1:[YOUR PORT]およびAndroid urlを http://10.0.2.2:[YOUR PORT]に設定します。それは私のために働いた。
ローカルホストでウェブサーバーを実行しています。
エミュレータを開いてローカルホストに接続したい場合は、192.168.x.x
を使用しています。これは、ローカルLAN IPアドレスを使用する必要があることを意味します。ちなみに、HttpResponseException (Bad Request)
は、ホストに到達できないという意味ではありません。
他のいくつかのエラーがこの例外につながります。
問題は、Androidエミュレーターが10.0.2.2
を127.0.0.1
にマップし、notをlocalhost
にマップすることです。したがって、Webサーバーを127.0.0.1:54722
ではなくlocalhost:54722
でserveronに設定します。それはそれを行う必要があります。
「BadRequest」は、通常はサーバー自体によって送信されたエラーです。 rfc 2616 を参照してください
10.4.1 400 Bad Request
構文が正しくないため、サーバーがリクエストを理解できませんでした。クライアントは、変更せずにリクエストを繰り返すべきではありません。
したがって、サーバーへの正常な接続を取得しましたが、リクエストはエキスパートフォームに適合しません。接続をどのように作成するか、どのヘッダーが含まれているか(もしあれば)はわかりませんが、確認する必要があります。
さらにヘルプが必要な場合は、コードの内容とサーバーへの接続に使用するコードを説明してください。
ここ は同じ問題の質問です。答えは、ヘッダーにcontent-typeが設定されていなかったことです。
uRLを10.0.2.2:portNr
として設定する必要があります
portNr =
ASP.NET開発サーバーによって指定されたポート。現在のサービスはlocalhost:3229/Service.svc
で実行されています。
だから私のURLは10.0.2.2:3229
です
この方法で問題を修正しました
私はそれが役立つことを願っています...
ローカルホストを実行した後、ここでhttp://localhost:[port number]/
を取得し、ポート番号を見つけました。
次に、CommandからIPアドレスを取得し、windowsコマンドを開いてipconfig
私の場合、IPは192.168.10.33
であったため、URLは http://192.168.10.33:[port number] /になります。 Androidでは、スタジオはこのURLをURLとして使用します。その後、エミュレータの手動プロキシでURLとポート番号を設定します。
Laravel Homesteadユーザーの場合:LaravelをHomesteadで使用している場合は、エミュレータで192.168.10.10を使用してアプリバックエンドにアクセスできます。
まだ動かない?別の良い解決策は、ngrokを使用することです https://ngrok.com/
10.0.2.2
はAndroidのセキュアドメインではないため、デフォルトでは非TLS接続が禁止されているAPI 28+のネットワーク構成で非セキュアドメインを許可する必要があります。
次の構成を使用できます。
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">
AndroidエミュレーターからIISExpress Web APIにアクセスする方法を紹介したいと思います。 Visual Studio 2015を使用しています。そして、Android StudioからAndroidエミュレーターを呼び出します。
applicationhost.configファイルのバインディング設定に次の行を追加するだけです
<binding protocol="http" bindingInformation="*:<your-port>:" />
次に、IP [4]アドレスを確認して使用し、AndroidエミュレーターからAPIにアクセスします
要件:Visual Studioを管理者として実行する必要があります。 この投稿 は、これを行うための完璧な方法を提供します。
詳細については、githubで my post をご覧ください。
お役に立てれば。
不正な要求とは、通常、送信しているデータの形式が正しくないことを意味します。データマッピングが一致していない可能性があります。不正なリクエストを受け取っている場合は、サーバーに接続できることを意味しますが、リクエストは適切に送信されていません。
node expressやangular-cliなどのサードパーティのパッケージを使用している場合は、マシンのIPを見つけ、ホストをサーバーの起動構成内でそのホストに接続する必要があります(localhostの代わりに)。次に、IPを使用してエミュレーターから起動します。たとえば、angular-cliを使用するには、ng serve -H 10.149.212.104
を使用する必要がありました。次に、使用したエミュレータから:http://10.149.212.104:4200
サービスレイヤーが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.x.x:8090として私のIPアドレスを指す必要があります
開発プラットフォームとして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 。
誰かがまだこれを探しているなら、これは私のために働いた方法です。
接続しているデバイス/エミュレータに関して、マシンのIPを見つける必要があります。エミュレーターの場合、以下の手順に従うことです。
このIPを提供して、エミュレーターからローカルホストにアクセスします。ポートは、サービスの実行/公開中に指定したものと同じです。
注#1:ファイアウォールとインバウンドルールに注意してください。
注#2:マシンを再起動した後、このIPを確認してください。何らかの理由で、「次のIPを使用」を指定した場合でも、ホストオンリーIPが変更されました。
必要なIPをWindowsタスクマネージャーで(ctrl + alt + delを押して)見つけるには、[パフォーマンス]タブで調べます。 。 。