Apache或其他客户机JAVA实现是否支持HTTP/2?

Apache或其他客户机JAVA实现是否支持HTTP/2?,java,apache,http,httpclient,http2,Java,Apache,Http,Httpclient,Http2,我正在寻找可以连接到基于HTTP/2的服务器的java客户端。。服务器已支持HTTP/2 API。我看不到最流行的ApacheHTTP客户端仍然支持Http/2 Apache是否已经有一些支持Http/2的Java客户端实现 如果没有,是否有一些java客户机支持连接到HTTP/2(最好是在Java7上) Jetty从9.3版开始支持HTTP2。这包括服务器和。有。提供了两个HTTP/2 Java客户端API。两者都需要Java8(或更好)和ALPN的强制使用,如前所述 低级API 这些API基

我正在寻找可以连接到基于HTTP/2的服务器的java客户端。。服务器已支持HTTP/2 API。我看不到最流行的ApacheHTTP客户端仍然支持Http/2

Apache是否已经有一些支持Http/2的Java客户端实现


如果没有,是否有一些java客户机支持连接到HTTP/2(最好是在Java7上)

Jetty从9.3版开始支持HTTP2。这包括服务器和。

有。

提供了两个HTTP/2 Java客户端API。两者都需要Java8(或更好)和ALPN的强制使用,如前所述

低级API 这些API基于,它基于会话和流的HTTP/2概念,并使用侦听器来通知从服务器到达的HTTP/2帧

//设置并启动HTTP2Client。
HTTP2Client client=新的HTTP2Client();
SslContextFactory SslContextFactory=新的SslContextFactory();
addBean(sslContextFactory);
client.start();
//连接到远程主机以获取会话。
未来承诺会话承诺=新的未来承诺();
connect(sslContextFactory,新的InetSocketAddress(主机,端口),新的ServerSessionListener.Adapter(),sessionPromise);
Session Session=sessionPromise.get(5,时间单位为秒);
//使用会话发出请求。
HttpFields requestFields=新的HttpFields();
requestFields.put(“用户代理”,client.getClass().getName()+”/“+Jetty.VERSION);
MetaData.Request MetaData=新的MetaData.Request(“GET”),新的HttpURI(“https://webtide.com/),HttpVersion.HTTP_2,requestFields);
HeadersFrame HeadersFrame=新的HeadersFrame(元数据,null,true);
session.newStream(headersFrame,new promission.Adapter(),new Stream.Listener.Adapter())
{
@凌驾
页眉上的公共空白(流、页眉框架)
{
//响应标题。
系统错误打印项次(帧);
}
@凌驾
公共void onData(流、数据帧、回调)
{
//回应内容。
系统错误打印项次(帧);
callback.successed();
}
});
高级API Jetty的
HttpClient
提供了一种使用方法,其中之一就是。应用程序将使用更高级别的HTTP API,但Jetty的底层将使用HTTP/2来传输HTTP语义

通过这种方式,应用程序可以透明地使用
HttpClient
提供的高级api,并确定在配置或启动代码中使用什么传输

//使用HTTP/2传输设置并启动HttpClient。
HTTP2Client HTTP2Client=新的HTTP2Client();
SslContextFactory SslContextFactory=新的SslContextFactory();
HttpClient HttpClient=新HttpClient(新HttpClientTransportOverHTTP2(http2Client),sslContextFactory);
httpClient.start();
//提出请求。
ContentResponse=httpClient.GET(“https://webtide.com/");

ApacheHttpClient-5测试版支持jdk9或更高版本的http/2

例如:

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);
}
publicstaticvoidmain(最终字符串[]args)引发异常{
最终SSLContext SSLContext=SSLContexts.custom().loadTrustMaterial(新的TrustAllStrategy()).build();
最终PoolgasSyncClient连接管理器connectionManager=PoolgasSyncClient连接管理器builder.create().SettlesStrategy(新的H2TlsStrategy(sslContext,NoopHostnameVerifier.INSTANCE)).build();
最终IOReactorConfig IOReactorConfig=IOReactorConfig.custom().setSoTimeout(Timeout.ofSeconds(5)).build();
final MinimalHttpAsyncClient客户端=HttpAsyncClients.createMinimal(HttpVersionPolicy.FORCE_HTTP_2,H2Config.DEFAULT,null,ioReactorConfig,connectionManager);
client.start();
最终HttpHost目标=新HttpHost(“localhost”,8082,“https”);

最终未来

jetty API没有错误报告…它只是挂起…即使是您提供的上述挂起(高级API)示例,我也忘了提到ALPN要求。我已通过链接到ALPN文档部分更新了答案。我最终选择了netty,因为这不需要ALPN支持