HttpClient 4 - Отправить Custom Cookie

1. обзор

В этом руководстве основное внимание будет уделеноhow to send a Custom Cookie using the Apache HttpClient 4.

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

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

Затемwe can set up this cookie store on the HttpClient using the setDefaultCookieStore() method и отправляем запрос:

@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 -without setting the proper domain, the client will not send the 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));
}

Других отличий от предыдущего примера нет, кроме способа построения клиента.

Если установка файла 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));
}

Низкоуровневой альтернативой установки 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));
}

Это конечно намного большеerror-prone than working with the built in cookie support. Например, обратите внимание, что в этом случае мы больше не устанавливаем домен - что неверно.

5. Заключение

В этой статье показано, какwork with the HttpClient to send a custom, user controlled Cookie.

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

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