Java HttpURLConnection не подключается, когда я вызываю connect()
-
23-09-2019 - |
Вопрос
Я пытаюсь написать программу для автоматического тестирования моего веб-приложения.Чтобы добиться этого, я открываю соединение, используя 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());
Почему я вижу такое поведение?Я делаю что-нибудь не так?
Спасибо за помощь.
Решение
В connect()
метод просто создает соединение.Вы должны зафиксировать запрос (позвонив getInputStream()
, getResponseCode()
, или getResponseMessage()
) для того, чтобы ответ был возвращен и обработан.
Другие советы
В подключиться() метод реализован в классе URLConnection и не переопределяется HttpURLConnection класс.
Класс URLConnection не знает о HTTP и поэтому не должен следовать за перенаправлением HTTP, даже если он создавал реальное соединение.
Если вам нужно поведение, присущее протоколу HTTP, вы, вероятно, захотите придерживаться методов, реализованных в классе HttpURLConnection, таких как метод getResponseCode().
Добавьте следующее в свой onCreate
StrictMode.ThreadPolicy policy = new StrictMode.
ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
Почему бы вам не использовать С помощью HttpClient из apache.
Попробуй Установите следующие направления, поскольку это могло бы помочь.На самом деле, попробуй getFollowRedirects
сначала, чтобы увидеть, проблема ли это (маловероятно, поскольку по умолчанию это true).
Редактировать: Если это не ваша проблема, я бы попробовал прочитать что-нибудь из соединения (как вы делаете с getResponseCode
но я бы тоже попробовал getHeaderField
чтобы увидеть, приводит ли чтение чего-либо вообще к соблюдению редиректа).