開発者ドキュメント

HttpClient 4 – カスタムクッキーを送信する


1概要

このチュートリアルでは、Apache HttpClient 4を使ってカスタムクッキーを送信する方法に焦点を絞ります。

もっと深く掘り下げて、HttpClientを使ってできることを他にも学びたい場合は、


HttpClientのメインチュートリアル


に進んでください。


2 HttpClient

でCookie管理を構成する

** 2.1. HttpClient 4.3以降

新しいHttpClient 4.3では、クライアントの構築と設定の両方を担当する流暢なビルダーAPIを活用します。

まず、クッキーストアを作成し、そのストアにサンプルクッキーを設定する必要があります。

BasicCookieStore cookieStore = new BasicCookieStore();
BasicClientCookie cookie = new BasicClientCookie("JSESSIONID", "1234");
cookie.setDomain(".github.com");
cookie.setPath("/");
cookieStore.addCookie(cookie);

次に、このCookieストアをHttpClientに設定してリクエストを送信します。

@Test
public void whenSettingCookiesOnTheHttpClient__thenCookieSentCorrectly()
  throws ClientProtocolException, IOException {
    BasicCookieStore cookieStore = new BasicCookieStore();
    BasicClientCookie cookie = new BasicClientCookie("JSESSIONID", "1234");
    cookie.setDomain(".github.com");
    cookie.setPath("/");
    cookieStore.addCookie(cookie);
    HttpClient client = HttpClientBuilder.create().setDefaultCookieStore(cookieStore).build();

    final HttpGet request = new HttpGet("http://www.github.com");

    response = client.execute(request);
    assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
}

非常に重要な要素は、


domain

__がCookieに設定されていることです。


適切なドメインを設定しないと、クライアントはCookieを送信しません


2.2. HttpClient 4.3より前のバージョン

HttpClientの古いバージョン(4.3より前)では、Cookieストアは

HttpClient

に直接設定されていました。

@Test
public void givenUsingDeprecatedApi__whenSettingCookiesOnTheHttpClient__thenCorrect()
  throws ClientProtocolException, IOException {
    BasicCookieStore cookieStore = new BasicCookieStore();
    BasicClientCookie cookie = new BasicClientCookie("JSESSIONID", "1234");
    cookie.setDomain(".github.com");
    cookie.setPath("/");
    cookieStore.addCookie(cookie);
    DefaultHttpClient client = new DefaultHttpClient();
    client.setCookieStore(cookieStore);

    HttpGet request = new HttpGet("http://www.github.com");

    response = client.execute(request);
    assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
}

クライアントの構築方法以外は、前の例との違いはありません。

HttpClient全体にCookieを設定することが選択肢にならない場合は、Cookieを使用してリクエストを個別に構成できます。

@Test
public void whenSettingCookiesOnTheRequest__thenCookieSentCorrectly()
  throws ClientProtocolException, IOException {
    BasicCookieStore cookieStore = new BasicCookieStore();
    BasicClientCookie cookie = new BasicClientCookie("JSESSIONID", "1234");
    cookie.setDomain(".github.com");
    cookie.setPath("/");
    cookieStore.addCookie(cookie);
    instance = HttpClientBuilder.create().build();

    HttpGet request = new HttpGet("http://www.github.com");

    HttpContext localContext = new BasicHttpContext();
    localContext.setAttribute(HttpClientContext.COOKIE__STORE, cookieStore);
   //localContext.setAttribute(ClientContext.COOKIE__STORE, cookieStore);//before 4.3
    response = instance.execute(request, localContext);

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

HTTPリクエストにクッキーを設定する低レベルの代替策は、生のヘッダとして設定することです。

@Test
public void whenSettingCookiesOnARequest__thenCorrect()
  throws ClientProtocolException, IOException {
    instance = HttpClientBuilder.create().build();
    HttpGet request = new HttpGet("http://www.github.com");
    request.setHeader("Cookie", "JSESSIONID=1234");

    response = instance.execute(request);

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

もちろん、これは組み込みのCookieサポートを使用するよりもはるかにエラーが発生しやすいものです。たとえば、この場合はドメインを設定していないことに注意してください。


5結論

この記事では、HttpClientを使ってカスタムのユーザー制御Cookieを送信する方法を説明しました。

これは、HttpClientがサーバーによって設定されたCookieを処理するのと同じではないことに注意してください。代わりに、クライアント側を低レベルで手動で制御します。

これらすべての例とコードスニペットの実装はhttps://github.com/eugenp/tutorials/tree/master/httpclient#readme[my githubプロジェクト]で見つけることができます。** – これはEclipseベースのプロジェクトです。そのままインポートして実行するのは簡単です。

モバイルバージョンを終了