1

給出一個URL字符串,我希望得到一個HTTP連接的「最後」(非重定向)網址:打開HTTP連接的「最後」(非重定向)網址

  • 如果響應代碼是2xx,那麼我可以簡單地使用初始連接。

  • 如果響應代碼是3xx,那麼我需要打開一個新連接並重試。

  • 對於任何其他響應代碼(如4xx或5xx),我「放棄」並返回null

我的代碼如下:

HttpURLConnection getConnection(String url) throws Exception 
{ 
    HttpURLConnection connection = (HttpURLConnection)new URL(url).openConnection(); 
    while (true) 
    { 
     connection.setInstanceFollowRedirects(true); 
     connection.setRequestProperty("User-Agent",""); 
     int responseCode = connection.getResponseCode(); 
     switch (responseCode/100) 
     { 
     case 2: 
      return connection; 
     case 3: 
      switch (responseCode) 
      { 
      case 300: 
       connection = ??? 
       break; 
      case 301: 
      case 302: 
      case 303: 
      case 305: 
      case 307: 
       connection = (HttpURLConnection)new URL(connection.getHeaderField("Location")).openConnection(); 
       break; 
      case 304: 
       connection = ??? 
       break; 
      default: 
       return null; 
      } 
      break; 
     default: 
      return null; 
     } 
    } 
} 

我的問題是在此:

  1. 我應該如何處理響應碼300和304?

  2. 我是否正確處理響應代碼301,302,303,305和307?

對上述方法的任何其他建設性評論也將被讚賞。

感謝

+0

所有的代碼在這裏http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html中定義,並且已經很好地解釋了,但並不是所有的代碼在你的情況下都有意義。問題是,你爲什麼想要處理它們呢? – dendini

+0

因爲我收到他們全部在不同的URL的響應代碼! –

+0

300到307似乎有意義,但爲什麼不簡單地嘗試它們?我不知道你連接到什麼以及你發送了什麼。例如,爲什麼你得到304返回?根據doc的說法:「如果客戶端執行了條件GET請求並允許訪問」,那麼您發送給服務器的是什麼? – dendini

回答