Рубрики
Без рубрики

HttpClient 4 – Отправка пользовательских файлов Cookie

Как отправить пользовательские файлы cookie с помощью Apache HttpClient 4.

Автор оригинала: Eugen Paraschiv.

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() и отправить запрос:

@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 .