«1. Обзор

В этом руководстве основное внимание будет уделено тому, как отправить пользовательский файл cookie с помощью Apache HttpClient 4.

Если вы хотите копнуть глубже и узнать о других интересных вещах, которые вы можете делать с помощью HttpClient, перейдите к основной учебник HttpClient.

2. Настройте управление файлами cookie на HttpClient

2.1. HttpClient После версии 4.3

В более новой версии HttpClient 4.3 мы будем использовать API-интерфейс Fluent Builder, отвечающий как за создание, так и за настройку клиента.

Во-первых, нам нужно создать хранилище файлов cookie и настроить наш образец файла cookie в хранилище:

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

Затем мы можем настроить это хранилище файлов cookie на HttpClient с помощью метода setDefaultCookieStore() и отправить the request:

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

Очень важным элементом является домен, который устанавливается в файле cookie — без установки надлежащего домена клиент вообще не будет отправлять файл cookie!

Кроме того, в зависимости от версии, которую вы используете, вам также может понадобиться установить:

cookie.setAttribute(ClientCookie.DOMAIN_ATTR, "true");

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. Установите файл cookie для запроса

Если установка файла cookie для всего HttpClient невозможна, мы можем настроить запросы с файлом cookie индивидуально, используя класс HttpContext:

@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. Установите параметр Файл cookie в низкоуровневом запросе

Низкоуровневой альтернативой установке файла cookie в 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, установленные сервером. Вместо этого он управляет клиентской стороной вручную на низком уровне.

Реализацию всех этих примеров и фрагментов кода можно найти в моем проекте на github.