HttpClient 4 - リダイレクトに従わない

HttpClient 4 –リダイレクトに従わない

1. 概要

この記事では、configure the Apache HttpClient 4 to stop following redirectsを実行する方法を示します。

デフォルトでは、HTTP仕様に従ってthe HttpClient will automatically follow redirects

一部のユースケースでは、それはまったく問題ないかもしれませんが、それが望ましくないユースケースも確かにあります。次に、そのデフォルトの動作とstop following redirectsを変更する方法を見ていきます。

深く掘り下げて、HttpClientでできる他のクールなことを学びたい場合は、the main HttpClient tutorialに進んでください。

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));
}

リダイレクト動作without using setting the actual raw http.protocol.handle-redirects parameterを構成するために使用できる代替APIに注意してください。

HttpClientParams.setRedirecting(params, false);

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

2.2. HttpClient4.3以降

クライアントを構築および構成するためのHttpClient 4.3 introduced a cleaner, more high level 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. 結論

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

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