2017-01-01 21 views
0

下面這段代碼應打印出網站的新位置,它使用Location頭重定向到一個新的網頁/文件(http://somepagethatredirects.me/after.txt):的Java URLConnection.getURL()只重定向後看似無關的方法被稱爲

URL website = new URL("http://somepagethatredirects.me/before.txt"); 
URLConnection urlConnection = website.openConnection(); 
System.out.println(urlConnection.getURL()); 

即使我們預期位置爲http://somepagethatredirects.me/after.txt,我們也會得到指定的URL參數。

添加(看似無關的)方法一樣urlConnection.getHeaderField("Location")urlConnection.getHeaderFields()甚至urlConnection.getExpiration()會(奇怪)給了我們預期的結果:

URL website = new URL("http://somepagethatredirects.me/before.txt"); 
URLConnection urlConnection = website.openConnection(); 
urlConnection.getHeaderFields(); 
System.out.println(urlConnection.getURL()); 

這是預期的行爲?這對我來說似乎是一個錯誤。


編輯1: 正如傑弗裏Bosbom指出,呼籲urlConnection.openConnection()實際上並沒有建立與服務器的連接,urlConnection.connect()做(或暗示活動連接其他方法)。然而,這並不改變程序的輸出:

URL website = new URL("http://somepagethatredirects.me/before.txt"); 
URLConnection urlConnection = website.openConnection(); 
urlConnection.connect(); 
System.out.println(urlConnection.getURL()); 
+0

@JeffreyBosboom好主意,但'urlConnection.connect()'不會「更新」URL,我只是檢查它。我將它添加到問題中的方法中,並編寫另一個示例代碼。 – linkD

+0

[URLConnection.getURL()](https://docs.oracle.com/javase/7/docs/api/java/net/URLConnection.html#getURL())會返回您連接的原始網址,而不是''Location'頭,你不能從你連接的url中讀取任何東西,直到你通過調用'connect'建立了連接。 – Dummy

+0

@Dummy我不明白爲什麼'urlConnection.getURL()'返回新的不過,在我調用'urlConnection.getHeaderFields()'或'urlConnection.getExpiration()'後,我已經被重定向到了URL。 – linkD

回答

0

什麼也沒有發生在HTTP交易的條款,直到您:

  • 得到響應代碼
  • 打開輸入流
  • 打開錯誤流。

我不確定即使在此之後您有任何預計getURL()才能提供最終目標網址的依據。