HttpAsyncClient Tutorial

1. Übersicht

In diesem Tutorial werden die häufigsten Anwendungsfälle des Apache HttpAsyncClient veranschaulicht - von der grundlegenden Verwendung über das Einrichten eines Proxys , die Verwendung des SSL-Zertifikats bis hin zur Authentifizierung beim asynchronen Client.

2. Einfaches Beispiel

Zuerst - sehen wir uns in einem einfachen Beispiel an, wie HttpAsyncClient verwendet wird - senden Sie eine GET-Anfrage:

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

Beachten Sie, wie wir den asynchronen Client starten müssen, bevor wir ihn verwenden können . ohne das würden wir die folgende Ausnahme bekommen:

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. Multithreading mit HttpAsyncClient

Lassen Sie uns nun sehen, wie Sie mit HttpAsyncClient mehrere Anforderungen gleichzeitig ausführen.

Im folgenden Beispiel senden wir drei GET-Anforderungen mit HttpAsyncClient und PoolingNHttpClientConnectionManager an drei verschiedene Hosts :

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

Hier ist unsere GetThread- Implementierung, um die Antwort zu verarbeiten:

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

Weiter - sehen wir uns an, wie Sie einen Proxy mit dem HttpAsyncClient einrichten und verwenden .

Im folgenden Beispiel senden wir eine HTTP- GET-Anforderung über den 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. SSL-Zertifikat mit HttpAsyncClient

Nun sehen wir uns an, wie Sie ein SSL-Zertifikat mit HttpAsyncClient verwenden .

Im folgenden Beispiel konfigurieren wir HttpAsyncClient so , dass alle Zertifikate akzeptiert werden :

@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. Cookies mit HttpAsyncClient

Weiter - sehen wir uns an, wie Cookies mit HttpAsyncClient verwendet werden .

Im folgenden Beispiel setzen wir vor dem Senden der Anfrage einen Cookie-Wert :

@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. Authentifizierung mit HttpAsyncClient

Weiter - sehen wir uns an, wie die Authentifizierung mit HttpAsyncClient verwendet wird .

Im folgenden Beispiel verwenden wir den CredentialsProvider , um über die Basisauthentifizierung auf einen Host zuzugreifen:

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

In diesem Artikel haben wir die verschiedenen Anwendungsfälle des asynchronen Apache Http-Clients veranschaulicht.

Die Implementierung all dieser Beispiele und Codefragmente finden Sie in meinem Github-Projekt - dies ist ein Eclipse-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein, wie es ist.