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