2010-01-28 58 views
7

我試圖編寫一個程序在我的webapp上執行自動測試。爲了做到這一點,我使用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。但是,如果我通過調用connection.getResponseCode()將connection.connect()行切換出來,它神奇地工作。

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

爲什麼我看到這種行爲?我做錯了什麼?

感謝您的幫助。

回答

16

connect()方法只是創建一個連接。您必須提交請求(通過調用getInputStream(),getResponseCode()getResponseMessage())以使響應返回並處理。

+0

謝謝,這似乎確實如此! – sangfroid 2010-01-28 00:33:52

+1

謝謝你!一直試圖理解爲什麼人們發出getInputStream()等沒有調用connect()。你剛剛向我澄清。 – Renatinn 2015-09-06 20:38:34

0

嘗試setFollowRedirects,因爲它可能有幫助。其實,試試getFollowRedirects看看它是否是問題,首先(不太可能,因爲它默認情況下是真的)。

編輯:如果這不是你的問題,我會嘗試從連接讀的東西(如你getResponseCode做,但我也想嘗試getHeaderField,看是否讀取所有東西導致重定向到被尊重)。

+0

已經嘗試過,getFollowRedirects返回true。另外,我在單獨的測試中遇到了單獨的setFollowRedirects問題。基本上,setInstanceFollowRedirects()不做任何事情,而setFollowRedirects()做它應該做的。不過,我認爲在單獨的帖子中詢問這個問題會更好,因爲這是一個單獨的問題。 – sangfroid 2010-01-28 00:20:23

+1

@sangfroid我認爲你會發現你必須從連接中實際讀取一些信息,才能閱讀/遵守重定向。 – 2010-01-28 00:21:59

1

connect()方法在URLConnection類中實現,並且不會被HttpURLConnection類覆蓋。

URLConnection類不知道HTTP,所以即使創建了真正的連接,也不應該遵循HTTP重定向。

如果你想要的行爲內在的HTTP協議,你可能想堅持在HttpURLConnection的類實現的方法,作爲getResponseCode()方法。

0

添加以下你的onCreate

StrictMode.ThreadPolicy policy = new StrictMode. 
ThreadPolicy.Builder().permitAll().build(); 
StrictMode.setThreadPolicy(policy); 
相關問題