1
0

More than 3 years have passed since last update.

外部URLに接続時HTTPステータスコード302が発生した時の対応

Posted at

概要

例えば外部のサイトにあるファイルをダウンロードして取ってくるようなプログラムを書く場合、サイトによってはブラウザではダウンロード出来るけど、コードからURL接続するとエラーになるということがあります。実際に、ChromeのDevToolsなどでブラウザでどのようにダウンロード出来ているか確認してみると、アクセスしにいったURLではHTTPステータスコード302が返されてます。
今回はこのHTTPステータスコード302についての対応についてメモ書きします。

HTTPステータスコード302とは

HTTPステータスコード「302リダイレクト」とはの記事にある通り、302とは「一時的なリダイレクト」が起こっているとされています。302の場合はブラウザに表示されるURLは変わらないので、DevToolsなどを使用しない限りはユーザはリダイレクトされていることに気付きません。

プログラムでどうやって対応すれば良いのか

302のレスポンスが返ってくる時に、ヘッダーのLocationにリダイレクト先のURLが格納されています。そのため、このLocationに格納されているURLに再度接続すれば良い、という対応になります。
こちらのStackOverflowの記事で、Javaでの実装が紹介されています。

実装サンプル

上記のStackOverflowの記事のほぼコピーですが、実装のサンプルになります。

Sample.java
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) {
      // エラー処理
    }
  }
}
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0