HttpClient 4 - Aangepaste cookie verzenden

1. Overzicht

Deze tutorial zal zich concentreren op hoe u een aangepaste cookie verzendt met behulp van de Apache HttpClient 4.

Als je dieper wilt graven en andere coole dingen wilt leren die je met de HttpClient kunt doen, ga dan naar de hoofdhandleiding van HttpClient.

2. Configureer Cookiebeheer op de HttpClient

2.1. HttpClient na 4.3

In de nieuwere HttpClient 4.3 gebruiken we de vloeiende bouwer-API die verantwoordelijk is voor zowel het construeren als configureren van de client.

Eerst moeten we een cookie-winkel maken en onze voorbeeldcookie in de winkel instellen:

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

Dan, we kunnen deze cookie-opslag op de HttpClient instellen met behulp van de setDefaultCookieStore () methode en stuur het verzoek:

@Test openbare leegte whenSettingCookiesOnTheHttpClient_thenCookieSentCorrectly () gooit ClientProtocolException, IOException {BasicCookieStore cookieStore = nieuwe BasicCookieStore (); BasicClientCookie-cookie = nieuwe BasicClientCookie ("JSESSIONID", "1234"); cookie.setDomain (". github.com"); cookie.setPath ("/"); cookieStore.addCookie (cookie); HttpClient client = HttpClientBuilder.create (). SetDefaultCookieStore (cookieStore) .build (); laatste HttpGet-verzoek = nieuwe HttpGet ("// www.github.com"); response = client.execute (verzoek); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); }

Een heel belangrijk element is de domein wordt ingesteld op de cookie - zonder het juiste domein in te stellen, zal de klant de cookie niet verzenden helemaal!

Afhankelijk van de exacte versie die u gebruikt, moet u mogelijk ook het volgende instellen:

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

2.2. HttpClient vóór 4.3

Met oudere versies van de HttpClient (vóór 4.3) - werd de cookie-opslag rechtstreeks op de HttpClient:

@Test openbare ongeldige gegevenUsingDeprecatedApi_whenSettingCookiesOnTheHttpClient_thenCorrect () gooit ClientProtocolException, IOException {BasicCookieStore cookieStore = nieuwe BasicCookieStore (); BasicClientCookie-cookie = nieuwe BasicClientCookie ("JSESSIONID", "1234"); cookie.setDomain (". github.com"); cookie.setPath ("/"); cookieStore.addCookie (cookie); DefaultHttpClient client = nieuwe DefaultHttpClient (); client.setCookieStore (cookieStore); HttpGet request = nieuwe HttpGet ("// www.github.com"); response = client.execute (verzoek); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); }

Behalve de manier waarop de client is gebouwd, is er geen ander verschil met het vorige voorbeeld.

3. Plaats de cookie op het verzoek

Als het instellen van de cookie op de gehele HttpClient geen optie is, kunnen we verzoeken met de cookie individueel configureren met behulp van de HttpContext klasse:

@Test openbare leegte whenSettingCookiesOnTheRequest_thenCookieSentCorrectly () gooit ClientProtocolException, IOException {BasicCookieStore cookieStore = nieuwe BasicCookieStore (); BasicClientCookie-cookie = nieuwe BasicClientCookie ("JSESSIONID", "1234"); cookie.setDomain (". github.com"); cookie.setPath ("/"); cookieStore.addCookie (cookie); instantie = HttpClientBuilder.create (). build (); HttpGet request = nieuwe HttpGet ("// www.github.com"); HttpContext localContext = nieuwe BasicHttpContext (); localContext.setAttribute (HttpClientContext.COOKIE_STORE, cookieStore); // localContext.setAttribute (ClientContext.COOKIE_STORE, cookieStore); // vóór 4.3 response = instance.execute (request, localContext); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); }

4. Zet de cookie op het verzoek op laag niveau

Een alternatief op laag niveau voor het instellen van de cookie op het HTTP-verzoek is om het in te stellen als een onbewerkte koptekst:

@Test openbare leegte whenSettingCookiesOnARequest_thenCorrect () gooit ClientProtocolException, IOException {instance = HttpClientBuilder.create (). Build (); HttpGet request = nieuwe HttpGet ("// www.github.com"); request.setHeader ("Cookie", "JSESSIONID = 1234"); response = instance.execute (verzoek); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); }

Dit is natuurlijk veel meer foutgevoelig dan werken met de ingebouwde cookie-ondersteuning. Merk bijvoorbeeld op dat we in dit geval het domein niet langer instellen - wat niet correct is.

5. Conclusie

Dit artikel illustreert hoe werk samen met de HttpClient om een ​​aangepaste, door de gebruiker gecontroleerde cookie te verzenden.

Merk op dat dit niet hetzelfde is als de HttpClient de cookies laten afhandelen die door een server zijn ingesteld. In plaats daarvan bestuurt het de clientzijde handmatig op een laag niveau.

De implementatie van al deze voorbeelden en codefragmenten is te vinden in mijn github-project.