HttpClient 4 - Send tilpasset informasjonskapsel

1. Oversikt

Denne opplæringen vil fokusere på hvordan du sender en tilpasset informasjonskapsel ved hjelp av Apache HttpClient 4.

Hvis du vil grave dypere og lære andre kule ting du kan gjøre med HttpClient - gå videre til hovedopplæringen til HttpClient.

2. Konfigurer informasjonskapseladministrasjon på HttpClient

2.1. HttpClient Etter 4.3

I den nyere HttpClient 4.3 vil vi utnytte den flytende byggherren API som er ansvarlig for både å konstruere og konfigurere klienten.

Først må vi opprette en informasjonskapselbutikk og sette opp eksemplet på informasjonskapsel i butikken:

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

Deretter, vi kan sette opp denne informasjonskapselbutikken på HttpClient ved hjelp av setDefaultCookieStore () metode og send forespørselen:

@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 (informasjonskapsel); HttpClient-klient = HttpClientBuilder.create (). SetDefaultCookieStore (cookieStore) .build (); endelig HttpGet-forespørsel = ny HttpGet ("// www.github.com"); respons = klient.utfør (forespørsel); assertThat (respons.getStatusLine (). getStatusCode (), equalTo (200)); }

Et veldig viktig element er domene blir satt på informasjonskapselen - uten å angi riktig domene, vil ikke klienten sende informasjonskapselen i det hele tatt!

Avhengig av den nøyaktige versjonen du bruker, må du kanskje også angi:

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

2.2. HttpClient Før 4.3

Med eldre versjoner av HttpClient (før 4.3) - ble informasjonskapselbutikken satt direkte på HttpClient:

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

Annet enn måten klienten er bygget på, er det ingen annen forskjell fra forrige eksempel.

3. Sett informasjonskapsel på forespørsel

Hvis det ikke er mulig å sette informasjonskapsel på hele HttpClient, kan vi konfigurere forespørsler med informasjonskapslen individuelt ved hjelp av 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 (informasjonskapsel); forekomst = HttpClientBuilder.create (). build (); HttpGet forespørsel = 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 respons = instans. utfør (forespørsel, localContext); assertThat (respons.getStatusLine (). getStatusCode (), equalTo (200)); }

4. Sett informasjonskapselen på forespørsel om lavt nivå

Et alternativ på lavt nivå for å angi informasjonskapsel på HTTP-forespørsel vil være å sette den som en rå header:

@Test offentlig ugyldig nårSettingCookiesOnARequest_thenCorrect () kaster ClientProtocolException, IOException {instans = HttpClientBuilder.create (). Build (); HttpGet forespørsel = ny HttpGet ("// www.github.com"); request.setHeader ("Cookie", "JSESSIONID = 1234"); respons = forekomst. utfør (forespørsel); assertThat (respons.getStatusLine (). getStatusCode (), equalTo (200)); }

Dette er selvfølgelig mye mer feilutsatt enn å jobbe med den innebygde cookie-støtten. Legg for eksempel merke til at vi ikke lenger angir domenet i dette tilfellet - noe som ikke er riktig.

5. Konklusjon

Denne artikkelen illustrerte hvordan samarbeide med HttpClient for å sende en tilpasset, brukerstyrt informasjonskapsel.

Merk at dette ikke er det samme som å la HttpClient håndtere informasjonskapslene satt av en server. I stedet styrer det klientsiden manuelt på et lavt nivå.

Implementeringen av alle disse eksemplene og kodebiter finner du i github-prosjektet mitt.


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