Плохой запрос при попытке подключения к ISS 7 Express из эмулятора Android

В моем IIS я создал Web Api, и это URL проекта http://localhost:54444.

Я могу подключиться к этому URL из моего браузера в Windows8, однако я не могу сделать это в своем браузере эмулятора Android через http://10.0.2.2:54444,

Мой Android-браузер может подключиться к google.com.

Я также пытаюсь сделать клиента в Eclipse, используя http://loopj.com/android-async-http/ library:

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.

Любое предложение будет оценено.

1 ответ

ОП, казалось, нашел решение, но ради потомков, вот более подробное объяснение того, что происходит и как это исправить.

У меня была похожая проблема с использованием локального сервера Rails. Я понял, что не понимаю взаимосвязи между IP-адресом и именем хоста. Они разные, и если мы не будем осторожны, у нас могут возникнуть проблемы.

Связь между IP-адресом и именами хоста в файле хоста

Имена хостов могут быть назначены IP-адресам, но IP-адреса не назначаются именам хостов.

имя хоста -> IP-адрес

Эта взаимосвязь кажется тривиальной, но важно понимать, что это односторонние отношения. Имя хоста переносит вас на IP-адрес, но IP-адрес не знает имя хоста.

Допустим, у нас есть два имени хоста, которые указывают на 127.0.0.1: localhost и localdev. Теперь допустим, что у меня сервер, прослушивающий localhost:3000. Если я наберу localdev:3000, что бы вы ожидали?

Tha ответ ничто.

Localhost и localdev могут указывать на один и тот же IP-адрес, но IP-адрес не указывает на имена хостов. С этими отношениями данные идут только в одну сторону.

localhost -> 127.0.0.1 <- localdev

Прослушивание на локальном хосте и прослушивание на 127.0.0.1 - это не одно и то же

Я заметил, что когда я запускал сервер Ruby on Rails, в журналах указывалось, что сервер прослушивает localhost:3000. В моем браузере, когда я нажимал на localhost:3000, я видел сайт, который я создаю.

Теперь 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. Следовательно, если вы попытаетесь нажать другое имя хоста, указывающее на 127.0.0.1 (например, localdev было из предыдущего примера), это также будет работать.

Очистка 10.0.2.2 и связь с Localhost

Как только мы поймем связь между localhost и 127.0.0.1, мы сможем лучше понять связь между 10.0.2.2, исходящим из Android и localhost на вашем компьютере. Документы Android об использовании эмулятора говорят, что 10.0.2.2 ссылается на:

Специальный псевдоним интерфейса петли вашего хоста (т. Е. 127.0.0.1 на вашем компьютере разработки)

Обратите внимание, что он указывает на IP-адрес, а не на имя хоста. Если сервер прослушивает 127.0.0.1 вместо localhost, эмулятор сможет успешно отправлять сообщения на наш сервер.

Другие вопросы по тегам