2013-04-02 4 views
10

をリダイレクトハンドル:アンドロイドHttpURLConnectionの:HTTPは、私はちょうどそのようURLを取得し<code>HttpURLConnection</code>を使用してい

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

リダイレクトがあった場合、それは永久的な(301)であった場合、私は今、知りたいですか第1のケースではデータベース内のURLを更新するが、第2のケースでは更新しない。

HttpURLConnectionのリダイレクト処理を使用していてもこれは可能ですか?

+2

興味深い質問。私はこれを扱う標準的な方法はないと思う。 instanceFollowRedirectsをfalseに設定し、応答コードを手動で処理する必要があります。 – Perception

答えて

9

単にgetInputStream()を呼び出した後URLConnectionインスタンス上getUrl()を呼び出す:

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

最初のコード例では、一時的なリダイレクトと永続的なリダイレクトを区別する方法はありますか?そして、2番目の例は、私が避けたいと思っている実際のリダイレクト処理を私に任せています。 – 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; 
} 
は、
関連する問題