Apache 或其他一些客户端 JAVA 实现是否支持 HTTP/2?
Does Apache or some other CLIENT JAVA implementation support HTTP/2?
我正在寻找可以连接到基于 HTTP/2 的服务器的 java 客户端。该服务器已经支持 HTTP/2 API。我没有看到最流行的 Apache Http 客户端 https://hc.apache.org/ 仍然支持 HTTP/2。
Apache 是否已经为支持 Http/2 的 Java 客户端实现了某些实现?
如果没有,是否有一些 java 客户端支持连接到 HTTP/2,最好是在 Java 7 上?
Jetty 从 9.3 版本开始支持 HTTP2。这包括服务器和 the client.
有OkHttp: An HTTP & HTTP/2 client for Android and Java applications.
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.
低级 API
这些 API 基于 HTTP2Client,它基于 session 和 streams 的 HTTP/2 概念并使用侦听器来通知从服务器到达的 HTTP/2 frames。
// 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();
}
});
高级 API
Jetty 的HttpClient
提供了一种使用方法different transports, one of which is the HTTP/2 transport。应用程序将使用更高级别的 HTTP API,但在 Jetty 下将使用 HTTP/2 来传输 HTTP 语义。
这样,应用程序可以透明地使用 HttpClient
提供的高级 API,并在配置或启动代码中分解出要使用的传输。
// 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/");
Apache httpclient-5 beta 支持 http/2 来自 jdk9 或更高版本
示例:
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);
}
参考:https://hc.apache.org/httpcomponents-client-5.0.x/examples-async.html
我正在寻找可以连接到基于 HTTP/2 的服务器的 java 客户端。该服务器已经支持 HTTP/2 API。我没有看到最流行的 Apache Http 客户端 https://hc.apache.org/ 仍然支持 HTTP/2。
Apache 是否已经为支持 Http/2 的 Java 客户端实现了某些实现?
如果没有,是否有一些 java 客户端支持连接到 HTTP/2,最好是在 Java 7 上?
Jetty 从 9.3 版本开始支持 HTTP2。这包括服务器和 the client.
有OkHttp: An HTTP & HTTP/2 client for Android and Java applications.
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.
低级 API
这些 API 基于 HTTP2Client,它基于 session 和 streams 的 HTTP/2 概念并使用侦听器来通知从服务器到达的 HTTP/2 frames。
// 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();
}
});
高级 API
Jetty 的HttpClient
提供了一种使用方法different transports, one of which is the HTTP/2 transport。应用程序将使用更高级别的 HTTP API,但在 Jetty 下将使用 HTTP/2 来传输 HTTP 语义。
这样,应用程序可以透明地使用 HttpClient
提供的高级 API,并在配置或启动代码中分解出要使用的传输。
// 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/");
Apache httpclient-5 beta 支持 http/2 来自 jdk9 或更高版本
示例:
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);
}
参考:https://hc.apache.org/httpcomponents-client-5.0.x/examples-async.html