HttpClient 4 - Invia cookie personalizzato

1. Panoramica

Questo tutorial si concentrerà su come inviare un cookie personalizzato utilizzando Apache HttpClient 4 .

Se vuoi approfondire e imparare altre cose interessanti che puoi fare con HttpClient, vai al tutorial principale di HttpClient.

2. Configurare la gestione dei cookie su HttpClient

2.1. HttpClient dopo 4.3

Nella più recente HttpClient 4.3, sfrutteremo l'API del builder fluente responsabile sia della costruzione che della configurazione del client.

Innanzitutto, dovremo creare un negozio di cookie e impostare il nostro cookie di esempio nel negozio:

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

Quindi, possiamo impostare questo cookie store su HttpClient utilizzando il metodo setDefaultCookieStore () e inviare la richiesta:

@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 elemento molto importante è il dominio impostato sul cookie: senza impostare il dominio corretto, il client non invierà affatto il cookie !

Inoltre, a seconda della versione esatta che utilizzi, potresti dover impostare anche:

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

2.2. HttpClient prima di 4.3

Con le versioni precedenti di HttpClient (prima della 4.3), il cookie store è stato impostato direttamente su 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)); }

A parte il modo in cui è costruito il client, non c'è altra differenza rispetto all'esempio precedente.

3. Impostare il cookie sulla richiesta

Se l'impostazione del cookie sull'intero HttpClient non è un'opzione, possiamo configurare le richieste con il cookie individualmente utilizzando 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. Impostare il cookie sulla richiesta di basso livello

Un'alternativa di basso livello per impostare il cookie sulla richiesta HTTP sarebbe impostarlo come intestazione non elaborata:

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

Questo è ovviamente molto più soggetto a errori che lavorare con il supporto dei cookie integrato . Ad esempio, nota che in questo caso non stiamo più impostando il dominio, il che non è corretto.

5. conclusione

Questo articolo ha illustrato come lavorare con HttpClient per inviare un cookie personalizzato e controllato dall'utente .

Si noti che questo non equivale a lasciare che HttpClient gestisca i cookie impostati da un server. Invece, controlla manualmente il lato client a un livello basso.

L'implementazione di tutti questi esempi e frammenti di codice può essere trovata nel mio progetto GitHub.