Java HttpURLConnection не подключается, когда я вызываю connect () - PullRequest
7 голосов
/ 28 января 2010

Я пытаюсь написать программу для автоматического тестирования моего веб-приложения. Для этого я открываю соединение, используя HttpURLConnection.

Одна из страниц, которые я пытаюсь проверить, выполняет перенаправление 302. Мой тестовый код выглядит так:

URL currentUrl = new URL(urlToSend);
HttpURLConnection connection = (HttpURLConnection) currentUrl.openConnection();
connection.connect();
system.out.println(connection.getURL().toString());

Итак, допустим, что urlToSend равен http://www.foo.com/bar.jsp, и эта страница перенаправляет вас на http://www.foo.com/quux.jsp. Мой оператор println должен распечатать http://www.foo.com/quux.jsp, верно?

НЕПРАВИЛЬНО.

Перенаправление никогда не происходит, и он печатает исходный URL. Однако, если я изменяю, отключите строку connection.connect () с вызовом connection.getResponseCode (), это волшебным образом сработает.

URL currentUrl = new URL(urlToSend);
HttpURLConnection connection = (HttpURLConnection) currentUrl.openConnection();
//connection.connect();
connection.getResponseCode();
system.out.println(connection.getURL().toString());

Почему я вижу это поведение? Я что-то не так делаю?

Спасибо за помощь.

Ответы [ 5 ]

17 голосов
/ 28 января 2010

Метод connect() просто создает соединение. Вы должны зафиксировать запрос (позвонив getInputStream(), getResponseCode() или getResponseMessage()) для ответа, который будет возвращен и обработан.

1 голос
/ 29 апреля 2015

Добавьте следующее в свой onCreate

StrictMode.ThreadPolicy policy = new StrictMode.
ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy); 
1 голос
/ 28 января 2010

Метод connect () реализован в классе URLConnection и не переопределяется классом HttpURLConnection .

Класс URLConnection не знает HTTPи поэтому не должен следовать перенаправлению HTTP, даже если он создает реальное соединение.

Если вы хотите, чтобы поведение было встроено в протокол HTTP, вы, вероятно, хотите придерживаться методов, реализованных в классе HttpURLConnection, как getResponseCode() метод.

0 голосов
/ 28 января 2010

Попробуйте setFollowRedirects , так как это может помочь. На самом деле, попробуйте getFollowRedirects, чтобы сначала убедиться, что это проблема (маловероятно, так как это правда по умолчанию).

Редактировать: Если это не ваша проблема, я бы попробовал прочитать что-то из соединения (как вы делаете с getResponseCode, но я бы попробовал также getHeaderField, чтобы увидеть, вызывает ли чтение что-либо вообще редирект, который необходимо соблюдать).

0 голосов
/ 28 января 2010

Почему вы не используете HttpClient от apache.

...