HttpClient 4 - Enviar cookie personalizado

1. Visão geral

Este tutorial se concentrará emhow to send a Custom Cookie using the Apache HttpClient 4.

Se você quiser se aprofundar e aprender outras coisas legais que você pode fazer com o HttpClient - vá parathe mainHttpClienttutorial.

2.1. HttpClient após 4.3

No HttpClient 4.3 mais recente, vamos aproveitar a API fluent builder responsável tanto pela construção quanto pela configuração do cliente.

Primeiro, precisamos criar uma loja de cookies e configurar nosso cookie de amostra na loja:

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

Então,we can set up this cookie store on the HttpClient using the setDefaultCookieStore() methode envie a solicitação:

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

Um elemento muito importante é odomain sendo definido no cookie -without setting the proper domain, the client will not send the cookie em tudo!

2.2. HttpClient antes de 4.3

Com versões mais antigas do HttpClient (antes de 4.3) - o armazenamento de cookies foi definido diretamente noHttpClient:

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

Além da forma como o cliente é construído, não há outra diferença em relação ao exemplo anterior.

Se definir o cookie em todo o HttpClient não for uma opção, podemos configurar as solicitações com o cookie individualmente usando a classeHttpContext:

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

Uma alternativa de baixo nível para definir o cookie na solicitação HTTP seria defini-lo como um cabeçalho bruto:

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

É claro que isso é muito maiserror-prone than working with the built in cookie support. Por exemplo, observe que não estamos mais definindo o domínio neste caso - o que não é correto.

5. Conclusão

Este artigo ilustrou comowork with the HttpClient to send a custom, user controlled Cookie.

Observe que isso não é o mesmo que permitir que o HttpClient lide com os cookies definidos por um servidor. Em vez disso, ele está controlando o lado do cliente manualmente em um nível baixo.

A implementação de todos esses exemplos e trechos de código pode ser encontrada emmy github project.