Java HttpURLConnection не подключается, когда я вызываю connect()


Я пытаюсь написать программу для автоматического тестирования в моем веб-приложении. Для этого я открываю соединение с помощью 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-адрес. Однако, если я изменюсь, отключите соединение.соедините () линию с вызовом соединения.getResponseCode (), это волшебно работает.

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

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

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

5 7

5 ответов:

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

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

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

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

Добавьте в onCreate

StrictMode.ThreadPolicy policy = new StrictMode.
ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy); 

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

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

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