2010-01-28 13 views
7

Próbuję napisać program do automatycznego testowania na mojej aplikacji internetowej. Aby to osiągnąć, otwieram połączenie za pomocą HttpURLConnection.Java HttpURLConnection nie łączy się, gdy wywołuję connect()

Jedna ze stron, które próbuję przetestować, wykonuje przekierowanie 302. Mój kod testowy wygląda następująco:

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

Więc powiedzmy, że urlToSend jest http://www.foo.com/bar.jsp, i że ta strona przekierowuje do http://www.foo.com/quux.jsp. Moje oświadczenie println powinno wydrukować http://www.foo.com/quux.jsp, prawda?

NIEPRAWIDŁOWE.

Przekierowanie nigdy się nie dzieje i wypisuje oryginalny adres URL. Jednakże, jeśli zmienię, wyłączyłem linię connection.connect() z wywołaniem connection.getResponseCode(), to działa w magiczny sposób.

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

Dlaczego widzę to zachowanie? Czy robię coś złego?

Dzięki za pomoc.

Odpowiedz

16

Metoda connect() po prostu tworzy połączenie. Musisz wysłać żądanie (dzwoniąc pod numer getInputStream(), getResponseCode() lub getResponseMessage()), aby odpowiedź została zwrócona i przetworzona.

+0

Dziękuję, wygląda na to, że tak jest! – sangfroid

+1

Dziękuję za to! Próbowałem zrozumieć, dlaczego ludzie wydają getInputStream() i takie, nie wywołując nigdy connect(). Właśnie mi to wyjaśniłeś. – Renatinn

0

Wypróbuj setFollowRedirects, ponieważ może to pomóc. Właściwie spróbuj getFollowRedirects, aby sprawdzić, czy to jest problem, najpierw (mało prawdopodobne, ponieważ domyślnie jest to prawda).

Edit: Jeśli nie jest to problem, chciałbym spróbować czyta coś z przyłącza (jak to zrobić z getResponseCode ale chciałbym spróbować również getHeaderField aby sprawdzić, czy czytanie czegokolwiek w ogóle powoduje przekierowanie być przestrzegane).

+0

już próbował, że getFollowRedirects zwraca true. Ponadto mam osobny problem z setFollowRedirects w osobnym teście. Zasadniczo setInstanceFollowRedirects() nic nie robi, natomiast setFollowRedirects() robi to, co powinien. Pomyślałem jednak, że lepiej byłoby zapytać o to w osobnym poście, ponieważ jest to osobny problem. – sangfroid

+1

@ sangfroid Myślę, że przekonasz się, że musisz przeczytać coś z połączenia, aby uzyskać przekierowanie do przeczytania/przestrzegania. –

1

Metoda connect() jest zaimplementowana w klasie URLConnection i nie jest nadpisywana przez klasę HttpURLConnection.

Klasa URLConnection nie zna protokołu HTTP, dlatego nie powinna wykonywać przekierowań HTTP, nawet jeśli tworzyła prawdziwe połączenie.

Jeśli chcesz zachowanie nieodłączne dla protokołu HTTP, prawdopodobnie chcesz trzymać się metod zaimplementowanych w klasie HttpURLConnection, ponieważ jest to metoda getResponseCode().

0

Dodaj następujący w onCreate

StrictMode.ThreadPolicy policy = new StrictMode. 
ThreadPolicy.Builder().permitAll().build(); 
StrictMode.setThreadPolicy(policy); 
Powiązane problemy