2013-04-02 160 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; 
} 
相关问题