Jetty https://www.eclipse.org/jetty/提供了两个 HTTP/2 Java 客户端 API。两者都需要 Java 8(或更高版本)并且强制使用 ALPN,如所解释的here https://www.eclipse.org/jetty/documentation/current/alpn-chapter.html.
低级 API
这些API基于HTTP2客户端 http://download.eclipse.org/jetty/stable-9/apidocs/org/eclipse/jetty/http2/client/HTTP2Client.html,它基于 HTTP/2 的概念session and streams并使用侦听器来通知 HTTP/2frames从服务器到达的。
// 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's HttpClient
提供了一种使用方法不同的交通工具 https://webtide.com/pluggable-transports-for-jetty-9-1s-httpclient/,其中之一是HTTP/2 传输 https://webtide.com/http2-support-for-httpclient/。应用程序将使用更高级别的 HTTP API,但在底层 Jetty 将使用 HTTP/2 来传输 HTTP 语义。
这样,应用程序就可以使用由HttpClient
透明地,并考虑在配置或启动代码中使用什么传输。
// 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/");