HttpClient 4 - Envoyer un cookie personnalisé

1. Vue d'ensemble

Ce tutoriel se concentrera surhow to send a Custom Cookie using the Apache HttpClient 4.

Si vous voulez creuser plus profondément et apprendre d'autres choses intéressantes, vous pouvez faire avec HttpClient - rendez-vous surthe mainHttpClienttutorial.

2.1. HttpClient après 4.3

Dans le plus récent HttpClient 4.3, nous tirerons parti de l'API fluent builder responsable à la fois de la construction et de la configuration du client.

Tout d'abord, nous devons créer un magasin de cookies et configurer notre exemple de cookie dans le magasin:

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

Ensuite,we can set up this cookie store on the HttpClient using the setDefaultCookieStore() method et envoyez la requête:

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

Un élément très important est ledomain défini sur le cookie -without setting the proper domain, the client will not send the cookie du tout!

2.2. HttpClient avant 4.3

Avec les anciennes versions de HttpClient (avant 4.3) - le magasin de cookies était défini directement sur lesHttpClient:

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

Hormis la façon dont le client est construit, il n’ya pas d’autre différence par rapport à l’exemple précédent.

Si la configuration du cookie sur l'ensemble du HttpClient n'est pas une option, nous pouvons configurer les requêtes avec le cookie individuellement en utilisant la 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));
}

Une alternative de bas niveau consistant à définir le cookie sur la requête HTTP serait de le définir comme un en-tête brut:

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

C'est bien sûr beaucoup plus deerror-prone than working with the built in cookie support. Par exemple, notez que nous ne définissons plus le domaine dans ce cas, ce qui n'est pas correct.

5. Conclusion

Cet article a illustré commentwork with the HttpClient to send a custom, user controlled Cookie.

Notez que cela ne revient pas à laisser le HttpClient gérer les cookies définis par un serveur. Au lieu de cela, il contrôle manuellement le côté client à un niveau bas.

L'implémentation de tous ces exemples et extraits de code se trouve dansmy github project.