Tutorial HttpAsyncClient

1. Gambaran keseluruhan

Dalam tutorial ini, kami akan menerangkan kes penggunaan yang paling biasa dari Apache HttpAsyncClient - dari penggunaan asas, hingga cara menyediakan proksi , cara menggunakan sijil SSL dan akhirnya - cara mengesahkan dengan klien async.

2. Contoh Ringkas

Pertama - mari lihat bagaimana menggunakan HttpAsyncClient dalam contoh mudah - hantar permintaan GET:

@Test public void whenUseHttpAsyncClient_thenCorrect() throws Exception { CloseableHttpAsyncClient client = HttpAsyncClients.createDefault(); client.start(); HttpGet request = new HttpGet("//www.google.com"); Future future = client.execute(request, null); HttpResponse response = future.get(); assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); client.close(); }

Perhatikan bagaimana kita perlu memulakan klien async sebelum menggunakannya ; tanpa itu, kita akan mendapat pengecualian berikut:

java.lang.IllegalStateException: Request cannot be executed; I/O reactor status: INACTIVE at o.a.h.u.Asserts.check(Asserts.java:46) at o.a.h.i.n.c.CloseableHttpAsyncClientBase. ensureRunning(CloseableHttpAsyncClientBase.java:90)

3. Multi-Threading Dengan HttpAsyncClient

Sekarang - mari kita lihat bagaimana menggunakan HttpAsyncClient untuk melaksanakan beberapa permintaan secara serentak.

Dalam contoh berikut - kami menghantar tiga permintaan GET kepada tiga host yang berbeza menggunakan HttpAsyncClient dan PoolingNHttpClientConnectionManager :

@Test public void whenUseMultipleHttpAsyncClient_thenCorrect() throws Exception { ConnectingIOReactor ioReactor = new DefaultConnectingIOReactor(); PoolingNHttpClientConnectionManager cm = new PoolingNHttpClientConnectionManager(ioReactor); CloseableHttpAsyncClient client = HttpAsyncClients.custom().setConnectionManager(cm).build(); client.start(); String[] toGet = { "//www.google.com/", "//www.apache.org/", "//www.bing.com/" }; GetThread[] threads = new GetThread[toGet.length]; for (int i = 0; i < threads.length; i++) { HttpGet request = new HttpGet(toGet[i]); threads[i] = new GetThread(client, request); } for (GetThread thread : threads) { thread.start(); } for (GetThread thread : threads) { thread.join(); } }

Berikut adalah pelaksanaan GetThread kami untuk menangani tindak balas:

static class GetThread extends Thread { private CloseableHttpAsyncClient client; private HttpContext context; private HttpGet request; public GetThread(CloseableHttpAsyncClient client,HttpGet req){ this.client = client; context = HttpClientContext.create(); this.request = req; } @Override public void run() { try { Future future = client.execute(request, context, null); HttpResponse response = future.get(); assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); } catch (Exception ex) { System.out.println(ex.getLocalizedMessage()); } } }

4. Proksi Dengan HttpAsyncClient

Seterusnya - mari kita lihat cara menyediakan dan menggunakan proksi dengan HttpAsyncClient .

Dalam contoh berikut - kami menghantar permintaan HTTP GET melalui proksi :

@Test public void whenUseProxyWithHttpClient_thenCorrect() throws Exception { CloseableHttpAsyncClient client = HttpAsyncClients.createDefault(); client.start(); HttpHost proxy = new HttpHost("74.50.126.248", 3127); RequestConfig config = RequestConfig.custom().setProxy(proxy).build(); HttpGet request = new HttpGet("//issues.apache.org/"); request.setConfig(config); Future future = client.execute(request, null); HttpResponse response = future.get(); assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); client.close(); }

5. Sijil SSL Bersama HttpAsyncClient

Sekarang - mari lihat bagaimana menggunakan Sijil SSL dengan HttpAsyncClient .

Dalam contoh berikut - kami mengkonfigurasi HttpAsyncClient untuk menerima semua sijil :

@Test public void whenUseSSLWithHttpAsyncClient_thenCorrect() throws Exception { TrustStrategy acceptingTrustStrategy = new TrustStrategy() { public boolean isTrusted(X509Certificate[] certificate, String authType) { return true; } }; SSLContext sslContext = SSLContexts.custom() .loadTrustMaterial(null, acceptingTrustStrategy).build(); CloseableHttpAsyncClient client = HttpAsyncClients.custom() .setSSLHostnameVerifier(SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER) .setSSLContext(sslContext).build(); client.start(); HttpGet request = new HttpGet("//mms.nw.ru/"); Future future = client.execute(request, null); HttpResponse response = future.get(); assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); client.close(); }

6. Kuki Dengan HttpAsyncClient

Seterusnya - mari lihat bagaimana menggunakan kuki dengan HttpAsyncClient .

Dalam contoh berikut - kami menetapkan nilai kuki sebelum menghantar permintaan :

@Test public void whenUseCookiesWithHttpAsyncClient_thenCorrect() throws Exception { BasicCookieStore cookieStore = new BasicCookieStore(); BasicClientCookie cookie = new BasicClientCookie("JSESSIONID", "1234"); cookie.setDomain(".github.com"); cookie.setPath("/"); cookieStore.addCookie(cookie); CloseableHttpAsyncClient client = HttpAsyncClients.custom().build(); client.start(); HttpGet request = new HttpGet("//www.github.com"); HttpContext localContext = new BasicHttpContext(); localContext.setAttribute(HttpClientContext.COOKIE_STORE, cookieStore); Future future = client.execute(request, localContext, null); HttpResponse response = future.get(); assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); client.close(); }

7. Pengesahan Dengan HttpAsyncClient

Seterusnya - mari lihat bagaimana menggunakan pengesahan dengan HttpAsyncClient .

Dalam contoh berikut - kami menggunakan CredentialsProvider untuk mengakses hos melalui pengesahan asas:

@Test public void whenUseAuthenticationWithHttpAsyncClient_thenCorrect() throws Exception { CredentialsProvider provider = new BasicCredentialsProvider(); UsernamePasswordCredentials creds = new UsernamePasswordCredentials("user", "pass"); provider.setCredentials(AuthScope.ANY, creds); CloseableHttpAsyncClient client = HttpAsyncClients.custom().setDefaultCredentialsProvider(provider).build(); client.start(); HttpGet request = new HttpGet("//localhost:8080"); Future future = client.execute(request, null); HttpResponse response = future.get(); assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); client.close(); }

8. Kesimpulannya

Dalam artikel ini, kami menggambarkan pelbagai kes penggunaan klien Apache Http asinkron.

Pelaksanaan semua contoh dan coretan kod ini terdapat di projek github saya - ini adalah projek berasaskan Eclipse, jadi mudah untuk diimport dan dijalankan sebagaimana adanya.