1. 概要

この記事では、リダイレクトの追跡を停止するようにApacheHttpClientを構成する方法を示します

デフォルトでは、HTTP仕様に従って、HttpClientは自動的にリダイレクトに従います。

一部のユースケースでは、それは完全に問題ないかもしれませんが、それが望ましくないユースケースも確かにあります。次に、そのデフォルトの動作を変更し、リダイレクトの追跡を停止する方法を見ていきます。

深く掘り下げて、HttpClientでできる他のクールなことを学びたい場合は、メインのHttpClientチュートリアルに進んでください。

2. リダイレクトに従わないでください

2.1. HttpClient4.3より前

古いバージョンのHttpクライアント(4.3より前)では、クライアントがリダイレクトで行うことを次のように構成できます。

@Test
public void givenRedirectsAreDisabled_whenConsumingUrlWhichRedirects_thenNotRedirected() 
  throws ClientProtocolException, IOException {
    DefaultHttpClient instance = new DefaultHttpClient();

    HttpParams params = new BasicHttpParams();
    params.setParameter(ClientPNames.HANDLE_REDIRECTS, false);
    // HttpClientParams.setRedirecting(params, false); // alternative

    HttpGet httpGet = new HttpGet("http://t.co/I5YYd9tddw");
    httpGet.setParams(params);
    CloseableHttpResponse response = instance.execute(httpGet);

    assertThat(response.getStatusLine().getStatusCode(), equalTo(301));
}

実際の生のhttp.protocol.handle-redirectsパラメーターを設定せずにリダイレクト動作を構成するために使用できる代替APIに注意してください。

HttpClientParams.setRedirecting(params, false);

また、フォローリダイレクトを無効にすると、HttpResponseステータスコードが実際に301 MovedPermanentlyであるかどうかを確認できることに注意してください。

2.2. HttpClient4.3以降

HttpClient 4.3は、クライアントを構築および構成するための、よりクリーンで高レベルのAPIを導入しました。

@Test
public void givenRedirectsAreDisabled_whenConsumingUrlWhichRedirects_thenNotRedirected() 
  throws ClientProtocolException, IOException {
    HttpClient instance = HttpClientBuilder.create().disableRedirectHandling().build();
    HttpResponse response = instance.execute(new HttpGet("http://t.co/I5YYd9tddw"));

    assertThat(response.getStatusLine().getStatusCode(), equalTo(301));
}

新しいAPIは、個々のリクエストだけでなく、このリダイレクト動作でクライアント全体を構成することに注意してください。

3. 結論

このクイックチュートリアルでは、 4.3より前と後の両方でApacheHttpClientを構成してHTTPリダイレクトに自動的に従わないようにする方法について説明しました。

これらすべての例とコードスニペットの実装は、私のgithubプロジェクトにあります。これはEclipseベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。