web-dev-qa-db-ja.com

HttpURLConnectionを使用してリダイレクトされたURLとコンテンツを取得する方法

URLが新しいページにリダイレクトされることがあるので、新しいページのURLを取得したいと思います。

これが私のコードです:

URL url = new URL("http://stackoverflow.com/questions/88326/");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setInstanceFollowRedirects(true);

System.out.println(conn.getURL().toString());

出力は次のとおりです。

stackoverflow.com/questions/88326/does-elmah-handle-caught-exceptions-as-well

Stack Overflow Webサイトではうまく機能しますが、sears.comサイトでは機能しません。

URLブローを入力すると:

http://www.sears.com/search=iphone

出力はまだです:

http://www.sears.com/search=iphone

しかし実際には、ページは次の場所にリダイレクトされます。

http://www.sears.com/tvs-electronics-phones-all-cell-phones/s-1231477012?keyword=iphone&autoRedirect=true&viewItems=25&redirectType=CAT_REC_PRED

どうすればこの問題を解決できますか?

10
user2105500

実際には、HttpClientを使用できます。これはHttpClient.followRedirect(true)を設定できます。HttpClinentがリダイレクトを処理します。

1
user2105500

getUrl()を呼び出した後、URLConnectionインスタンスで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);
20
syb0rg