2013-04-02 99 views
10

我使用HttpURLConnection檢索就是這樣一個URL:的Android HttpURLConnection類:處理HTTP重定向

URL url = new URL(address); 
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
connection.setInstanceFollowRedirects(true); 
// ... 

我現在想找出是否有一個重定向,如果這是一個永久性的(301)或臨時(302)一個,以便在第一個案例中更新數據庫中的URL,而不是第二個案例中的URL。

這是可能的,同時仍然使用重定向處理HttpURLConnection,如果,如何?

+2

有趣的問題。我不認爲有任何標準的方法來處理這個問題。您必須將instanceFollowRedirects設置爲false並手動處理響應代碼。 – Perception

回答

9

簡單地調用URLConnection例如getUrl()調用getInputStream()後:

URLConnection con = new URL(url).openConnection(); 
System.out.println("Orignal URL: " + con.getURL()); 
con.connect(); 
System.out.println("Connected URL: " + con.getURL()); 
InputStream is = con.getInputStream(); 
System.out.println("Redirected URL: " + con.getURL()); 
is.close(); 

如果您需要知道重定向是否真正得到它的內容,這裏是示例代碼之前發生的事情:

HttpURLConnection con = (HttpURLConnection) (new URL(url).openConnection()); 
con.setInstanceFollowRedirects(false); 
con.connect(); 
int responseCode = con.getResponseCode(); 
System.out.println(responseCode); 
String location = con.getHeaderField("Location"); 
System.out.println(location); 
+0

在您的第一個代碼示例中,是否有任何方法可以區分臨時重定向和永久重定向?你的第二個例子將實際的重定向處理留給我,我想避免。 – Julian

+0

可能有一種方法可以獲取所有臨時重定向,但我不確定如何解決此問題。 – syb0rg

+0

臨時重定向和永久重定向應該有不同的響應代碼。 301 =永久。 302和有時307是臨時的。 – Keab42

0
private HttpURLConnection openConnection(String url) throws IOException { 
    HttpURLConnection connection; 
    boolean redirected; 
    do { 
     connection = (HttpURLConnection) new URL(url).openConnection(); 
     int code = connection.getResponseCode(); 
     redirected = code == HTTP_MOVED_PERM || code == HTTP_MOVED_TEMP || code == HTTP_SEE_OTHER; 
     if (redirected) { 
      url = connection.getHeaderField("Location"); 
      connection.disconnect(); 
     } 
    } while (redirected); 
    return connection; 
} 
相關問題