Tutorial HttpAsyncClient

1. Panoramica

In questo tutorial illustreremo i casi d'uso più comuni di Apache HttpAsyncClient - dall'utilizzo di base, a come impostare un proxy , come utilizzare il certificato SSL e infine - come autenticarsi con il client asincrono.

2. Semplice esempio

Innanzitutto, vediamo come utilizzare HttpAsyncClient in un semplice esempio: invia una richiesta 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(); }

Nota come dobbiamo avviare il client asincrono prima di usarlo ; senza di ciò, avremmo la seguente eccezione:

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 con HttpAsyncClient

Vediamo ora come usare HttpAsyncClient per eseguire più richieste contemporaneamente.

Nell'esempio seguente, inviamo tre richieste GET a tre host diversi utilizzando HttpAsyncClient e 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(); } }

Ecco la nostra implementazione GetThread per gestire la risposta:

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. Proxy con HttpAsyncClient

Successivamente, vediamo come configurare e utilizzare un proxy con HttpAsyncClient .

Nel seguente esempio, inviamo una richiesta HTTP GET tramite proxy :

@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. Certificato SSL con HttpAsyncClient

Ora vediamo come utilizzare un certificato SSL con HttpAsyncClient .

Nell'esempio seguente, configuriamo HttpAsyncClient per accettare tutti i certificati :

@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. Cookie con HttpAsyncClient

Successivamente, vediamo come utilizzare i cookie con HttpAsyncClient .

Nell'esempio seguente, impostiamo un valore per il cookie prima di inviare la richiesta :

@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. Autenticazione con HttpAsyncClient

Successivamente, vediamo come usare l'autenticazione con HttpAsyncClient .

Nel seguente esempio, utilizziamo CredentialsProvider per accedere a un host tramite l'autenticazione di base:

@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. Conclusione

In questo articolo, abbiamo illustrato i vari casi d'uso del client Apache Http asincrono.

L'implementazione di tutti questi esempi e frammenti di codice può essere trovata nel mio progetto GitHub : questo è un progetto basato su Eclipse, quindi dovrebbe essere facile da importare ed eseguire così com'è.