Does Apache or some other CLIENT JAVA implementation support HTTP/2?
Asked Answered
P

4

12

I'm looking for java client that can connect to a HTTP/2 based server.. The server is already supporting HTTP/2 API. I don't see the most popular Apache Http client https://hc.apache.org/ still supporting HTTP/2.

Does Apache have some implementation for Java client already that supports Http/2?

If not, Is there some java client that supports connecting to HTTP/2 preferably on Java 7?

Pronunciation answered 16/1, 2016 at 4:10 Comment(0)
T
8

Jetty's provides two HTTP/2 Java client APIs. Both require Java 8 (or better) and the mandatory use of the ALPN, as explained here.

Low level APIs

These APIs are based on HTTP2Client, it's based on the HTTP/2 concepts of session and streams and uses listeners to be notified of the HTTP/2 frames that arrive from the server.

    // Setup and start the HTTP2Client.
    HTTP2Client client = new HTTP2Client();
    SslContextFactory sslContextFactory = new SslContextFactory();
    client.addBean(sslContextFactory);
    client.start();

    // Connect to the remote host to obtains a Session.
    FuturePromise<Session> sessionPromise = new FuturePromise<>();
    client.connect(sslContextFactory, new InetSocketAddress(host, port), new ServerSessionListener.Adapter(), sessionPromise);
    Session session = sessionPromise.get(5, TimeUnit.SECONDS);

    // Use the session to make requests.
    HttpFields requestFields = new HttpFields();
    requestFields.put("User-Agent", client.getClass().getName() + "/" + Jetty.VERSION);
    MetaData.Request metaData = new MetaData.Request("GET", new HttpURI("https://webtide.com/"), HttpVersion.HTTP_2, requestFields);
    HeadersFrame headersFrame = new HeadersFrame(metaData, null, true);
    session.newStream(headersFrame, new Promise.Adapter<>(), new Stream.Listener.Adapter()
    {
        @Override
        public void onHeaders(Stream stream, HeadersFrame frame)
        {
            // Response headers.
            System.err.println(frame);
        }

        @Override
        public void onData(Stream stream, DataFrame frame, Callback callback)
        {
            // Response content.
            System.err.println(frame);
            callback.succeeded();
        }
    });

High Level APIs

Jetty's HttpClient provides a way to use different transports, one of which is the HTTP/2 transport. Applications will use the higher level HTTP APIs, but underneath Jetty will use HTTP/2 to transport the HTTP semantic.

In this way, applications can use the high level APIs provided by HttpClient transparently, and factor out what transport to use in configuration or startup code.

    // 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/");
Tuggle answered 16/1, 2016 at 11:9 Comment(3)
There is no error reporting for the jetty API ... It just hangs ... Even the example you have provided above hangs (High level API)Pronunciation
I forgot to mention the ALPN requirement. I have updated the answer with a link to the ALPN documentation section.Tuggle
I finally went with netty as there is no ALPN support needed for thisPronunciation
S
3

There is OkHttp: An HTTP & HTTP/2 client for Android and Java applications.

Superbomb answered 16/1, 2016 at 4:43 Comment(0)
E
2

Jetty has support for HTTP2 starting from version 9.3. This includes the server and the client.

Empoison answered 16/1, 2016 at 4:26 Comment(0)
C
0

Apache httpclient-5 beta supports http/2 from jdk9 or above

example :

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

refer : https://hc.apache.org/httpcomponents-client-5.0.x/examples-async.html

Catholicon answered 16/11, 2018 at 14:2 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.