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

后端 未结 4 1225
野的像风
野的像风 2021-02-14 05:22

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

相关标签:
4条回答
  • 2021-02-14 06:05

    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/");
    
    0 讨论(0)
  • 2021-02-14 06:06

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

    0 讨论(0)
  • 2021-02-14 06:12

    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

    0 讨论(0)
  • 2021-02-14 06:13

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

    0 讨论(0)
提交回复
热议问题