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 ответов:
Метод
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
, чтобы увидеть, если чтение чего-либо вообще вызывает перенаправление уважается).