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

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

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

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

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

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 чтобы увидеть, если это проблема, во-первых (что маловероятно, так как это по умолчанию true).

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