HttpClient 4 - Kirim Cookie Kustom

1. Ikhtisar

Tutorial ini akan fokus pada cara mengirim Cookie Kustom menggunakan Apache HttpClient 4 .

Jika Anda ingin menggali lebih dalam dan mempelajari hal-hal keren lainnya yang dapat Anda lakukan dengan HttpClient - lanjutkan ke tutorial HttpClient utama.

2. Konfigurasi Manajemen Cookie di HttpClient

2.1. HttpClient Setelah 4.3

Di HttpClient 4.3 yang lebih baru, kita akan memanfaatkan fluent builder API yang bertanggung jawab membangun dan mengonfigurasi klien.

Pertama, kita perlu membuat penyimpanan cookie dan menyiapkan cookie sampel di toko:

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

Kemudian, kita dapat mengatur toko kue ini pada HttpClient menggunakan setDefaultCookieStore () metode dan mengirim permintaan:

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

Elemen yang sangat penting adalah domain yang disetel pada cookie - tanpa menyetel domain yang benar, klien tidak akan mengirim cookie sama sekali!

Selain itu, bergantung pada versi persis yang Anda gunakan, Anda mungkin juga perlu menyetel:

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

2.2. HttpClient Before 4.3

Dengan versi HttpClient yang lebih lama (sebelum 4.3) - penyimpanan cookie disetel langsung di 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)); }

Selain cara klien dibuat, tidak ada perbedaan lain dari contoh sebelumnya.

3. Atur Cookie pada Permintaan

Jika menyetel cookie di seluruh HttpClient bukanlah suatu pilihan, kita dapat mengonfigurasi permintaan dengan cookie satu per satu menggunakan kelas 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. Atur Cookie pada Permintaan Tingkat Rendah

Alternatif tingkat rendah untuk menyetel cookie pada Permintaan HTTP adalah menyetelnya sebagai Header mentah:

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

Ini tentu saja jauh lebih rentan terhadap kesalahan daripada bekerja dengan dukungan cookie bawaan . Misalnya, perhatikan bahwa kami tidak lagi menyetel domain dalam kasus ini - yang tidak benar.

5. Kesimpulan

Artikel ini mengilustrasikan cara bekerja dengan HttpClient untuk mengirim Cookie kustom yang dikontrol pengguna .

Perhatikan bahwa ini tidak sama dengan membiarkan HttpClient menangani cookie yang disetel oleh server. Sebaliknya, ini mengontrol sisi klien secara manual pada level rendah.

Penerapan semua contoh dan cuplikan kode ini dapat ditemukan di proyek github saya.