HttpClient 4 - Envoyer un cookie personnalisé

1. Vue d'ensemble

Ce didacticiel se concentrera sur la façon d'envoyer un cookie personnalisé à l'aide d'Apache HttpClient 4 .

Si vous souhaitez approfondir et apprendre d'autres choses intéressantes que vous pouvez faire avec HttpClient, rendez-vous au didacticiel principal HttpClient.

2. Configurez la gestion des cookies sur HttpClient

2.1. HttpClient après 4.3

Dans le plus récent HttpClient 4.3, nous exploiterons 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, nous pouvons configurer ce magasin de cookies sur HttpClient à l'aide de la méthode setDefaultCookieStore () et envoyer 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("//www.github.com"); response = client.execute(request); assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); }

Un élément très important est le domaine défini sur le cookie - sans définir le domaine approprié, le client n'enverra pas du tout le cookie !

De plus, selon la version exacte que vous utilisez, vous devrez peut-être également définir:

cookie.setAttribute(ClientCookie.DOMAIN_ATTR, "true"); 

2.2. HttpClient avant 4.3

Avec les anciennes versions de HttpClient (avant 4.3) - le magasin de cookies était défini directement sur 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("//www.github.com"); response = client.execute(request); assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); }

À part la façon dont le client est construit, il n'y a pas d'autre différence avec l'exemple précédent.

3. Définissez le cookie sur la demande

Si la configuration du cookie sur l'ensemble de HttpClient n'est pas une option, nous pouvons configurer les requêtes avec le cookie individuellement en utilisant la classe 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("//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. Définissez le cookie sur la demande de bas niveau

Une alternative de bas niveau pour 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("//www.github.com"); request.setHeader("Cookie", "JSESSIONID=1234"); response = instance.execute(request); assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); }

Ceci est bien sûr beaucoup plus sujet aux erreurs que de travailler avec la prise en charge des cookies intégrée . 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é comment travailler avec HttpClient pour envoyer un cookie personnalisé contrôlé par l'utilisateur .

Notez que ce n'est pas la même chose que de 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.

La mise en œuvre de tous ces exemples et extraits de code peut être trouvée dans mon projet github.