1

IIS で Web Api を作成しました。そのプロジェクトの URL は次のとおりです。http://localhost:54444.

Windows8 のブラウザからこの URL に接続する予定ですが、Android エミュレータ ブラウザではhttp://10.0.2.2:54444.

私の Android ブラウザは google.com に接続できます。

また、http: //loopj.com/android-async-http/ライブラリを使用して Eclipse でクライアントを作成しようとしています。

Log.v("bopzy_debug", "Testing HTTP Connectivity");
            System.out.println("123");
            AsyncHttpClient client = new AsyncHttpClient();

            client.get("http://10.0.2.2:54444/api/values/",
           // client.get("http://google.pl",
                    new AsyncHttpResponseHandler() {
                        @Override
                        public void onSuccess(String response) {
                            Log.v("bopzy_debug", response);

                        }
                        @Override
                        public void onFailure(Throwable error, String content)
                        {
                            System.out.println("onFailure");
                            System.out.println(content);
                             Log.w("bopzy_debug", error);
                        }
                        @Override
                        public void onFinish() {
                            System.out.println("onfinish:");
                            Log.v("bopzy_debug", "Finished..");
                        }
                    });
        }

私が得ているLogCat情報:

07-18 09:18:17.471: V/bopzy_debug(1354): Testing HTTP Connectivity
07-18 09:18:17.471: I/System.out(1354): 123
07-18 09:18:17.621: I/System.out(1354): onFailure
07-18 09:18:17.644: I/System.out(1354): <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">

07-18 09:18:17.644: I/System.out(1354): <HTML><HEAD><TITLE>Bad Request</TITLE>

07-18 09:18:17.644: I/System.out(1354): <META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>

07-18 09:18:17.644: I/System.out(1354): <BODY><h2>Bad Request - Invalid Hostname</h2>

07-18 09:18:17.652: I/System.out(1354): <hr><p>HTTP Error 400. The request hostname is invalid.</p>

07-18 09:18:17.652: I/System.out(1354): </BODY></HTML>

07-18 09:18:17.652: W/bopzy_debug(1354): org.apache.http.client.HttpResponseException: Bad Request
07-18 09:18:17.652: W/bopzy_debug(1354):    at com.loopj.android.http.AsyncHttpResponseHandler.sendResponseMessage(AsyncHttpResponseHandler.java:235)
07-18 09:18:17.652: W/bopzy_debug(1354):    at com.loopj.android.http.AsyncHttpRequest.makeRequest(AsyncHttpRequest.java:79)
07-18 09:18:17.652: W/bopzy_debug(1354):    at com.loopj.android.http.AsyncHttpRequest.makeRequestWithRetries(AsyncHttpRequest.java:95)
07-18 09:18:17.652: W/bopzy_debug(1354):    at com.loopj.android.http.AsyncHttpRequest.run(AsyncHttpRequest.java:57)
07-18 09:18:17.652: W/bopzy_debug(1354):    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:390)
07-18 09:18:17.652: W/bopzy_debug(1354):    at java.util.concurrent.FutureTask.run(FutureTask.java:234)
07-18 09:18:17.652: W/bopzy_debug(1354):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
07-18 09:18:17.652: W/bopzy_debug(1354):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
07-18 09:18:17.652: W/bopzy_debug(1354):    at java.lang.Thread.run(Thread.java:856)
07-18 09:18:17.682: I/System.out(1354): onfinish:
07-18 09:18:17.682: V/bopzy_debug(1354): Finished..

私が追加しました:

<uses-permission android:name="android.permission.INTERNET" />

AndroidManifest.xml ファイルに。

任意の提案をいただければ幸いです。

4

1 に答える 1

3

OPは解決策を見つけたように見えましたが、後世のために、何が起こっているのか、そしてそれを修正する方法のより完全な説明があります.

ローカル Rails サーバーを使用して同様の問題が発生しました。IP アドレスとホスト名の関係を理解し​​ていないことに気付きました。それらは異なっており、注意しないと問題が発生する可能性があります。

ホスト ファイル内の IP アドレスとホスト名の関係

ホスト名は IP アドレスに割り当てることができますが、IP アドレスはホスト名に割り当てられません。

ホスト名 --> IP アドレス

この関係は些細なことのように思えますが、一方通行の関係であることを理解することが重要です。ホスト名は IP アドレスにつながりますが、IP アドレスはホスト名を認識しません。

127.0.0.1 を指す 2 つのホスト名 (localhost と localdev) があるとします。ここで、localhost:3000 でリッスンしているサーバーがあるとします。localdev:3000 と入力すると、何が起こると思いますか?

その答えは何もありません。

Localhost と localdev は同じ IP アドレスを指している可能性がありますが、IP アドレスはホスト名を指していません。この関係では、データは一方向にしか移動しません。

ローカルホスト --> 127.0.0.1 <-- localdev

Localhost でリッスンすることと 127.0.0.1 でリッスンすることは同じではありません

Ruby on Rails サーバーを起動したときに、サーバーが localhost:3000 でリッスンしていることをログが示していることに気付きました。ブラウザーで localhost:3000 にアクセスすると、作成中の Web サイトが表示されます。

現在、localhost はデフォルトで 127.0.0.1 を指していますが、127.0.0.1:3000 に移動するとどうなるでしょうか? 答え: 何もありません。Ruby サーバーは 127.0.0.1 ではなく、localhost でリッスンしているとは言いません。localhost は最終的に 127.0.0.1 になりますが、127.0.0.1 はサーバーがリッスンしているアドレスではありません。

ここで、サーバーが 127.0.0.1 でリッスンしていて、ブラウザーから localhost にアクセスした場合でも、localhost はすべてを 127.0.0.1 に転送するため、Web サイトを取得できます。結果として、127.0.0.1 を指す別のホスト名 (前の例の localdev など) をヒットしようとすると、それも機能します。

10.0.2.2 と Localhost の関係を整理する

localhost と 127.0.0.1 の関係を理解すると、Android からの 10.0.2.2 とマシン上の localhost の関係をよりよく理解できるようになります。エミュレーターの使用に関する Android ドキュメントには、10.0.2.2 が次のリンク先にリンクされていると記載されています。

ホスト ループバック インターフェイスへの特別なエイリアス (つまり、開発マシンでは 127.0.0.1)

ホスト名ではなく、IP アドレスを指していることに注意してください。サーバーが localhost ではなく 127.0.0.1 でリッスンするようにすると、エミュレーターはサーバーにメッセージを正常に送信できます。

于 2015-08-29T17:31:05.143 に答える