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));
}
クライアントの構築方法以外は、前の例との違いはありません。
3リクエストにクッキーを設定する
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));
}
4低レベルのリクエストにクッキーを設定する
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ベースのプロジェクトです。そのままインポートして実行するのは簡単です。