HttpClient 4 - POSTのリダイレクトに従う

HttpClient 4 – POSTのリダイレクトに従う

1. 概要

このクイックチュートリアルでは、Apache HttpClient 4を構成して、POST要求のリダイレクトを自動的に追跡する方法を示します。

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

デフォルトでは、リダイレクトが発生するGET要求のみが自動的に追跡されます。 POST要求がHTTP 301 Moved Permanentlyまたは302 Foundthe redirect is not automatically followedのいずれかで応答された場合。

これはHTTP RFC 2616で指定されます。

GETまたはHEAD以外の要求に応答して301ステータスコードを受信した場合、要求が発行された条件が変わる可能性があるため、ユーザーエージェントは要求をユーザーが確認できない限り自動的にリダイレクトしてはいけません。

もちろん、その動作を変更し、厳密なHTTP仕様を緩和する必要があるユースケースがあります。

まず、デフォルトの動作を確認しましょう。

@Test
public void givenPostRequest_whenConsumingUrlWhichRedirects_thenNotRedirected()
  throws ClientProtocolException, IOException {
    HttpClient instance = HttpClientBuilder.create().build();
    HttpResponse response = instance.execute(new HttpPost("http://t.co/I5YYd9tddw"));
    assertThat(response.getStatusLine().getStatusCode(), equalTo(301));
}

ご覧のとおり、the redirect is not followed by defaultで、301 Status Codeが返されます。

2. HTTPPOSTでのリダイレクト

2.1. HttpClient4.3以降の場合

HttpClient 4.3では、クライアントの作成と構成の両方に、より高いレベルのAPIが導入されました。

@Test
public void givenRedirectingPOST_whenConsumingUrlWhichRedirectsWithPOST_thenRedirected()
  throws ClientProtocolException, IOException {
    HttpClient instance =
      HttpClientBuilder.create().setRedirectStrategy(new LaxRedirectStrategy()).build();
    HttpResponse response = instance.execute(new HttpPost("http://t.co/I5YYd9tddw"));
    assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
}

以前よりも読みやすい方法でクライアントの完全な構成を可能にするthe HttpClientBuilder is now the starting point of a fluent APIに注意してください。

2.2. HttpClient4.2の場合

前バージョンのHttpClient(4.2)では、クライアント上でリダイレクト戦略を直接構成できます。

@SuppressWarnings("deprecation")
@Test
public void givenRedirectingPOST_whenConsumingUrlWhichRedirectsWithPOST_thenRedirected()
  throws ClientProtocolException, IOException {
    DefaultHttpClient client = new DefaultHttpClient();
    client.setRedirectStrategy(new LaxRedirectStrategy());

    HttpResponse response = client.execute(new HttpPost("http://t.co/I5YYd9tddw"));
    assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
}

新しいLaxRedirectStrategyを使用すると、HTTP制限が緩和され、the redirect is followed over POST as well200 OKのステータスコードになります。

2.3. HttpClient4.2より前

HttpClient 4.2より前は、LaxRedirectStrategyクラスは存在しなかったため、独自のクラスを作成する必要があります。

@Test
public void givenRedirectingPOST_whenConsumingUrlWhichRedirectsWithPOST_thenRedirected()
  throws ClientProtocolException, IOException {
    DefaultHttpClient client = new DefaultHttpClient();
    client.setRedirectStrategy(new DefaultRedirectStrategy() {
        /** Redirectable methods. */
        private String[] REDIRECT_METHODS = new String[] {
            HttpGet.METHOD_NAME, HttpPost.METHOD_NAME, HttpHead.METHOD_NAME
        };

        @Override
        protected boolean isRedirectable(String method) {
            for (String m : REDIRECT_METHODS) {
                if (m.equalsIgnoreCase(method)) {
                    return true;
                }
            }
            return false;
        }
    });

    HttpResponse response = client.execute(new HttpPost("http://t.co/I5YYd9tddw"));
    assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
}

3. 結論

このクイックガイドでは、Apache HttpClient 4の任意のバージョンを構成して、HTTP POST要求のリダイレクトも追跡する方法を説明しました。厳密なHTTP標準を緩和します。

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