Java次のようにWebページにアクセスしています:
_URLConnection con = url.openConnection();
_
ただし、場合によっては、URLが別のURLにリダイレクトされます。だから、私は前のURLがリダイレクトされたURLを知りたいです。
以下は、応答として取得したヘッダーフィールドです。
_null-->[HTTP/1.1 200 OK]
Cache-control-->[public,max-age=3600]
last-modified-->[Sat, 17 Apr 2010 13:45:35 GMT]
Transfer-Encoding-->[chunked]
Date-->[Sat, 17 Apr 2010 13:45:35 GMT]
Vary-->[Accept-Encoding]
Expires-->[Sat, 17 Apr 2010 14:45:35 GMT]
Set-Cookie-->[cl_def_hp=copenhagen; domain=.craigslist.org; path=/; expires=Sun, 17 Apr 2011 13:45:35 GMT, cl_def_lang=en; domain=.craigslist.org; path=/; expires=Sun, 17 Apr 2011 13:45:35 GMT]
Connection-->[close]
Content-Type-->[text/html; charset=iso-8859-1;]
Server-->[Apache]
_
そのため、現在、_Set-Cookie
_ヘッダーフィールドの値からリダイレクトされたURLを構築しています。上記の場合、リダイレクトされるURLは_copenhagen.craigslist.org
_です
特定のURLがリダイレクトするURLを特定する標準的な方法はありますか。
URLが他のURLにリダイレクトするとき、サーバーはリダイレクトされたURLを伝えるLocation
ヘッダーフィールドを含む中間応答を送信しますが、url.openConnection();
メソッドを介してその中間応答を受信しません。
URLConnection
をHttpURLConnection
にキャストし、notに指示する必要があります HttpURLConnection#setInstanceFollowRedirects()
to false
。 HttpURLConnection#setFollowRedirects()
でグローバルに設定することもできます。
その場合、自分でリダイレクトを処理するだけです。 HttpURLConnection#getResponseCode()
で応答コードを確認し、 URLConnection#getHeaderField()
でLocation
ヘッダーを取得してから、新しいHTTPを起動しますそれを要求します。
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 );
public static URL getFinalURL(URL url) {
try {
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setInstanceFollowRedirects(false);
con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36");
con.addRequestProperty("Accept-Language", "en-US,en;q=0.8");
con.addRequestProperty("Referer", "https://www.google.com/");
con.connect();
//con.getInputStream();
int resCode = con.getResponseCode();
if (resCode == HttpURLConnection.HTTP_SEE_OTHER
|| resCode == HttpURLConnection.HTTP_MOVED_PERM
|| resCode == HttpURLConnection.HTTP_MOVED_TEMP) {
String Location = con.getHeaderField("Location");
if (Location.startsWith("/")) {
Location = url.getProtocol() + "://" + url.getHost() + Location;
}
return getFinalURL(new URL(Location));
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
return url;
}
「User-Agent」および「Referer」を自分で取得するには、インストールされているブラウザのいずれかのデベロッパーモードに移動するだけです(たとえば、Google ChromeでF12を押します)。次に、「ネットワーク」タブに移動し、リクエストのいずれかをクリックします。詳細が表示されるはずです。 「ヘッダー」サブタブを押すだけです(下の画像)
HttpURLConnection
class API documentation 、特にsetInstanceFollowRedirects()
をご覧ください。
実際には、HTTPクライアントとして堅牢なオープンソースライブラリを使用することをお勧めします。 ASFの http client をご覧になれば、生活がずっと楽になります。これは、http用の使いやすく、スケーラブルで堅牢なクライアントです。