概要
例えば外部のサイトにあるファイルをダウンロードして取ってくるようなプログラムを書く場合、サイトによってはブラウザではダウンロード出来るけど、コードからURL接続するとエラーになるということがあります。実際に、ChromeのDevToolsなどでブラウザでどのようにダウンロード出来ているか確認してみると、アクセスしにいったURLではHTTPステータスコード302が返されてます。
今回はこのHTTPステータスコード302についての対応についてメモ書きします。
HTTPステータスコード302とは
HTTPステータスコード「302リダイレクト」とはの記事にある通り、302とは「一時的なリダイレクト」が起こっているとされています。302の場合はブラウザに表示されるURLは変わらないので、DevToolsなどを使用しない限りはユーザはリダイレクトされていることに気付きません。
プログラムでどうやって対応すれば良いのか
302のレスポンスが返ってくる時に、ヘッダーのLocation
にリダイレクト先のURLが格納されています。そのため、このLocationに格納されているURLに再度接続すれば良い、という対応になります。
こちらのStackOverflowの記事で、Javaでの実装が紹介されています。
実装サンプル
上記のStackOverflowの記事のほぼコピーですが、実装のサンプルになります。
public class Sample {
// PhishTankからCSV情報を取得
public void urlSample() {
try {
// リダイレクト前のURLに接続
URL url = new URL("https://xxxx/xxxxxx");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setInstanceFollowRedirects(false);
String redirectLocation = conn.getHeaderField("Location");
conn.disconnect();
// リダイレクト先のURLで再度接続
URL afterRedirectUrl = new URL(redirectLocation);
InputStreamReader in = new InputStreamReader(afterRedirectUrl.openStream());
// この後は受け取ったデータの処理
} catch (Exception e) {
// エラー処理
}
}
}