1. Обзор
В этом руководстве основное внимание будет уделено тому, как отправить пользовательский файл cookie с помощью Apache HttpClient .
Если вы хотите копнуть глубже и узнать о других интересных вещах, которые можно делать с помощью HttpClient, — перейдите к основному руководству по HttpClient .
2. Настройте управление файлами cookie на HttpClient.
2.1. HTTP-клиент после 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. HTTP-клиент до версии 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 .