HttpClient 4 - Send brugerdefineret cookie

1. Oversigt

Denne tutorial vil fokusere på hvordan man sender en brugerdefineret cookie ved hjælp af Apache HttpClient 4.

Hvis du vil grave dybere og lære andre seje ting, kan du gøre med HttpClient - gå videre til HttpClient-hovedvejledningen.

2. Konfigurer Cookie Management på HttpClient

2.1. HttpClient Efter 4.3

I den nyere HttpClient 4.3 vil vi udnytte den flydende builder API, der er ansvarlig for både at konstruere og konfigurere klienten.

Først skal vi oprette en cookiebutik og oprette vores prøve-cookie i butikken:

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

Derefter, vi kan oprette denne cookiebutik på HttpClient ved hjælp af setDefaultCookieStore () metode og send anmodningen:

@Test offentlig ugyldig nårSettingCookiesOnTheHttpClient_thenCookieSentCorrectly () kaster ClientProtocolException, IOException {BasicCookieStore cookieStore = ny BasicCookieStore (); BasicClientCookie cookie = ny BasicClientCookie ("JSESSIONID", "1234"); cookie.setDomain (". github.com"); cookie.setPath ("/"); cookieStore.addCookie (cookie); HttpClient-klient = HttpClientBuilder.create (). SetDefaultCookieStore (cookieStore) .build (); endelig HttpGet-anmodning = ny HttpGet ("// www.github.com"); respons = klient. udfør (anmodning); assertThat (respons.getStatusLine (). getStatusCode (), equalTo (200)); }

Et meget vigtigt element er domæne bliver sat på cookien - uden at indstille det korrekte domæne, sender klienten ikke cookien overhovedet!

Afhængigt af den nøjagtige version, du bruger, skal du muligvis også indstille:

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

2.2. HttpClient før 4.3

Med ældre versioner af HttpClient (før 4.3) - blev cookiebutikken indstillet direkte på HttpClient:

@Test offentlig ugyldighed givenUsingDeprecatedApi_whenSettingCookiesOnTheHttpClient_thenCorrect () kaster ClientProtocolException, IOException {BasicCookieStore cookieStore = ny BasicCookieStore (); BasicClientCookie cookie = ny BasicClientCookie ("JSESSIONID", "1234"); cookie.setDomain (". github.com"); cookie.setPath ("/"); cookieStore.addCookie (cookie); DefaultHttpClient-klient = ny DefaultHttpClient (); client.setCookieStore (cookieStore); HttpGet anmodning = ny HttpGet ("// www.github.com"); respons = klient. udfør (anmodning); assertThat (respons.getStatusLine (). getStatusCode (), equalTo (200)); }

Bortset fra den måde klienten er bygget på, er der ingen anden forskel fra det foregående eksempel.

3. Sæt cookien på anmodningen

Hvis indstilling af cookien på hele HttpClient ikke er en mulighed, kan vi konfigurere anmodninger med cookien individuelt ved hjælp af HttpContext klasse:

@Test offentlig ugyldig nårSettingCookiesOnTheRequest_thenCookieSentCorrectly () kaster ClientProtocolException, IOException {BasicCookieStore cookieStore = ny BasicCookieStore (); BasicClientCookie cookie = ny BasicClientCookie ("JSESSIONID", "1234"); cookie.setDomain (". github.com"); cookie.setPath ("/"); cookieStore.addCookie (cookie); forekomst = HttpClientBuilder.create (). build (); HttpGet anmodning = ny HttpGet ("// www.github.com"); HttpContext localContext = ny BasicHttpContext (); localContext.setAttribute (HttpClientContext.COOKIE_STORE, cookieStore); // localContext.setAttribute (ClientContext.COOKIE_STORE, cookieStore); // før 4.3 svar = instans.execute (anmodning, localContext); assertThat (respons.getStatusLine (). getStatusCode (), equalTo (200)); }

4. Sæt cookien på anmodningen om lavt niveau

Et alternativ på lavt niveau for at indstille cookien på HTTP-anmodningen ville være at indstille den som en rå header:

@Test offentlig ugyldigt nårSettingCookiesOnARequest_thenCorrect () kaster ClientProtocolException, IOException {instans = HttpClientBuilder.create (). Build (); HttpGet anmodning = ny HttpGet ("// www.github.com"); request.setHeader ("Cookie", "JSESSIONID = 1234"); respons = eksempel.execute (anmodning); assertThat (respons.getStatusLine (). getStatusCode (), equalTo (200)); }

Dette er selvfølgelig meget mere fejlbehæftet end at arbejde med den indbyggede cookie-support. Bemærk f.eks., At vi ikke længere indstiller domænet i dette tilfælde - hvilket ikke er korrekt.

5. Konklusion

Denne artikel illustrerede, hvordan man gør det arbejde med HttpClient for at sende en brugerdefineret, brugerstyret cookie.

Bemærk, at dette ikke er det samme som at lade HttpClient håndtere de cookies, der er indstillet af en server. I stedet styrer det manuelt klientsiden på et lavt niveau.

Implementeringen af ​​alle disse eksempler og kodestykker findes i mit github-projekt.


$config[zx-auto] not found$config[zx-overlay] not found