Je recherche un client Java qui peut se connecter à un serveur basé sur http / 2. Le serveur prend déjà en charge l'API HTTP / 2. Je ne vois pas le client HTTP Apache https://hc.apache.org/ supportant toujours HTTP / 2. p>
Apache a déjà une implémentation pour le client Java qui prend en charge HTTP / 2? P>
Sinon, existe-t-il du client Java qui prend en charge la connexion à http / 2 de préférence sur Java 7? p>
4 Réponses :
Jetty a la prise en charge de http2 à partir de la version 9.3. Ceci inclut le serveur et le client . p>
jetty 's fournit deux API client HTTP / 2 Java. Les deux nécessitent Java 8 (ou mieux) et l'utilisation obligatoire de l'ALPN, comme expliqué Ici .
Ces API sont basées sur http2Client , il est basé sur les concepts http / 2 de session em> et les flux em> et utilise des auditeurs à notifier des cadres http / 2 em> qui arrivent du serveur. P> // Setup and start HttpClient with HTTP/2 transport.
HTTP2Client http2Client = new HTTP2Client();
SslContextFactory sslContextFactory = new SslContextFactory();
HttpClient httpClient = new HttpClient(new HttpClientTransportOverHTTP2(http2Client), sslContextFactory);
httpClient.start();
// Make a request.
ContentResponse response = httpClient.GET("https://webtide.com/");
Il n'y a pas de signalement d'erreur pour l'API de la jetée ... Il suffit de se bloquer ... même l'exemple que vous avez fourni au-dessus de Hors (API de haut niveau)
J'ai oublié de mentionner l'exigence d'ALPN. J'ai mis à jour la réponse avec un lien vers la section Documentation ALPN.
Je suis enfin allé avec Netty car il n'y a pas de soutien ALPN nécessaire pour cela
Apache httpClient-5 Beta prend en charge HTTP / 2 à partir de JDK9 ou supérieure à
Exemple: P>
public static void main(final String[] args) throws Exception {
final SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(new TrustAllStrategy()).build();
final PoolingAsyncClientConnectionManager connectionManager = PoolingAsyncClientConnectionManagerBuilder.create().setTlsStrategy(new H2TlsStrategy(sslContext, NoopHostnameVerifier.INSTANCE)).build();
final IOReactorConfig ioReactorConfig = IOReactorConfig.custom().setSoTimeout(Timeout.ofSeconds(5)).build();
final MinimalHttpAsyncClient client = HttpAsyncClients.createMinimal(HttpVersionPolicy.FORCE_HTTP_2, H2Config.DEFAULT, null, ioReactorConfig, connectionManager);
client.start();
final HttpHost target = new HttpHost("localhost", 8082, "https");
final Future<AsyncClientEndpoint> leaseFuture = client.lease(target, null);
final AsyncClientEndpoint endpoint = leaseFuture.get(10, TimeUnit.SECONDS);
try {
String[] requestUris = new String[] {"/"};
CountDownLatch latch = new CountDownLatch(requestUris.length);
for (final String requestUri: requestUris) {
SimpleHttpRequest request = SimpleHttpRequest.get(target, requestUri);
endpoint.execute(SimpleRequestProducer.create(request), SimpleResponseConsumer.create(), new FutureCallback<SimpleHttpResponse>() {
@Override
public void completed(final SimpleHttpResponse response) {
latch.countDown();
System.out.println(requestUri + "->" + response.getCode());
System.out.println(response.getBody());
}
@Override
public void failed(final Exception ex) {
latch.countDown();
System.out.println(requestUri + "->" + ex);
ex.printStackTrace();
}
@Override
public void cancelled() {
latch.countDown();
System.out.println(requestUri + " cancelled");
}
});
}
latch.await();
} catch (Exception e) {
e.printStackTrace();
}finally {
endpoint.releaseAndReuse();
}
client.shutdown(ShutdownType.GRACEFUL);
}